C + +;将std::array随机访问迭代器作为函数形参传递



所以我在这里看到了关于如何通过std::vector::iterator作为函数的参数参数的问题,然而,这些解决方案在处理std::array时似乎不适用。我想用它来做一个快速排序函数它取std::arrays。这是我到目前为止的代码:

#include <iostream>
#include <array>
#include <random>
#include <time.h>
using namespace std;

// Function declarations.
template<size_t SIZE>
void QuickSort(array<int, SIZE> arrayName, array<int, SIZE>::iterator low, 
array<int, SIZE>::iterator high);
template<size_t SIZE>
auto Partition(array<int, SIZE> arrayName, array<int, SIZE>::iterator low, 
array<int, SIZE>::iterator high);
// Main function.
int main()
{
// Set rand() seed to current time (NULL).
srand((unsigned)time(NULL));
// Declare array "randomNumberArray" of size #.
static array<int, 5> randomNumerArray = { 0 };
// Initialize array with random numbers.
for (auto it = randomNumerArray.begin(); it != randomNumerArray.end(); ++it)
*it = rand() % 500 + 1;
/*
This is where I would want to use the Quick Sort function to sort the array and
then print it out to the console.
*/
cin.get();
return 0;
}

// Function definitions. Standard Quick Sort syntax.
template<size_t SIZE>
void QuickSort(array<int, SIZE> arrayName, array<int, SIZE>::iterator low, 
array<int, SIZE>::iterator high)
{
if (low < high) {
// Function definition to be finished.
}
return;
}
/* Partition() returns auto to easily return the variable type I need
which is a Random Access Iterator.*/
template<size_t SIZE>
auto Partition(array<int, SIZE> arrayName, array<int, SIZE>::iterator low, 
array<int, SIZE>::iterator high)
{
auto pivot = high;
auto i = (low - 1);
for (auto j = low; j < pivot; ++j) {
if (*j < *pivot) {
int tempNum = 0;
tempNum = *(++i);
*i = *j;
*j = tempNum;
}
}
int tempNum = 0;
tempNum = *(++i);
*i = *pivot;
*pivot = tempNum;
return i;
}

正如您所看到的,我已经设法将大部分碎片适合这个难题,我只是不知道如何通过lowhigh,这意味着随机访问迭代器类型,作为函数的参数参数。使用std::array<type, size>::iterator不工作,因为它不是一个类型。我也试过添加#include <iterator>,但无济于事。

编辑:澄清一下,我试图传递的不是索引中包含的值,而是索引本身,它随着每次递归而变化。

您需要使用typename向编译器提示iterator是一种类型

template<size_t SIZE>
void QuickSort(typename array<int, SIZE>::iterator low,
typename array<int, SIZE>::iterator high);

但这也不起作用,因为SIZE是在一个非推断的上下文中。最好是把iterator作为模板

template<typename RandomIt>
void QuickSort(RandomIt low, RandomIt high);

提供c++ 20概念的替代方案:

void Quicksort(std::random_access_iterator auto low,
std::random_access_iterator auto high);

这将提供与常规模板相比的限制:

  1. 检查是否提供了迭代器
  2. Iterator支持对底层容器的随机访问。

其他迭代器类型可以在这里找到:https://en.cppreference.com/w/cpp/iterator

OR Google "迭代器概念c++20"如果链接无效。

奖励:这将允许你接受std::array和std::vector。像std::set和std::list这样的容器不会,因为底层实现是链表。仔细检查你想要接受的容器,并适当调整使用的概念。

相关内容

  • 没有找到相关文章