假设我有一个大小为 1000 的 vector 。我想将该 vector 的一部分传递给此函数:
template <typename T>
void insertion_sort (vector<T> &a) { // vector: pg 1012; & (reference): pg 383
for (long int i = 1; i < a.size(); i++) {
for (long int j = i; (j > 0) && (a[j] < a[j-1]); j--) {
std::swap(a[j], a[j-1]);
}
}
}
假设我想对 100-1000 的 vector 进行排序。 我会像这样传入函数吗:
insertion_sort(&a[100]);
我尝试使用迭代器,但函数不接受它。在这种情况下,恐怕调用 size()
时,它会是 1000 而不是 900。
实现此目标的最佳方法是什么?
最佳答案
如果您不能修改函数,前提是您可以创建 vector 的拷贝,将其传递给函数并复制回来:
std::vector<int> v( 1000 );
auto it = v.begin();
std::advance( it, 100 );
std::vector<int> tmp( it, v.end() );
insertion_sort( tmp );
std::copy( tmp.begin(), tmp.end(), it );
或者您可以删除前 100 个元素,对 vector 进行排序并将它们放回去:
std::vector<int> v( 1000 );
auto it = v.begin();
std::advance( it, 100 );
std::vector<int> tmp( v.begin(), it );
v.erase( v.begin(), it );
insertion_sort( v );
v.insert( v.begin(), tmp.begin(), tmp.end() );
否则当前编写的函数不提供对 vector 进行部分排序的方法。为了支持它应该像大多数标准算法一样编写 - 接受 2 个迭代器的范围:
template< class RandomIt >
void sort( RandomIt first, RandomIt last );
关于c++ - 将 vector 的一部分传递给 C++ 中的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26922082/