我将带有20个项目的向量传递给下面的函数。我的目标是改变向量中项目的顺序。如果列表包含项目1 2 3 4,我希望最终结果为4 3 2 1.基本上将第一项切换为最后一项,将第二项切换为倒数第二项。
template<typename T>
void changePosition(std::vector<T>& list)
{
std::cout << "Swapping \n";
for (int i = 0; i < list.size(); i++)
{
std::iter_swap(list.begin() + i, list.end() - i);
}
std::cout << "Swapped \n";
}
我最终收到错误:
c ++ vector iterator not dereferencable
有什么想法吗?我没有找到任何能够达到我想要达到的目标的样本。
确实可以使用std :: reverse,我正在进行的赋值要求我使用iter_swap。
答案 0 :(得分:5)
list.end()
指向一个超过向量的最后一个元素。因此,在循环的第一次迭代中,list.end() - i
将指向一个结束,并且不能被解除引用(或传递给iter_swap
)。
您应该使用list.end() - i - 1
,以便从最后一个元素开始。
但是一旦解决了这个问题,你就会遇到另一个问题:你的代码将每个元素交换两次,所以什么都不会改变。你应该停在矢量的中间来解决这个问题。
当然,反转矢量的最佳方法是使用标准函数std::reverse
而不是重新发明轮子。
答案 1 :(得分:4)
也许你应该只使用std::reverse
答案 2 :(得分:0)
我设法解决了以下问题:
template<typename T>
void changePosition(std::vector<T>& list)
{
std::cout << "Swapping \n";
typedef std::vector<T>::iterator iterator;
iterator first = list.begin();
iterator last = list.end();
while ((first != last) && (first != --last))
{
std::iter_swap(first, last);
++first;
}
std::cout << "Swapped \n";
}
我怀疑这是解决问题的最好方法,但它完成了工作。试图反转矢量的其他人确实应该使用std :: reverse。
我诉诸iter_swap的唯一原因是因为我正在努力要求它。
答案 3 :(得分:0)
您可以使用iter_swap。实际上std :: reverse也使用了iter_swap
#include<vector>
#include<iostream>
template<class BidirIt>
void reverseVector(BidirIt first, BidirIt last)
{
while ((first != last) && (first != --last)) {
std::iter_swap(first++, last);
}
}
int main()
{
std::vector<int> vec{1,2,3,4};
for(auto v:vec)
{
std::cout<<v<<" ";
}
std::cout<<"After reverting"<<"\n";
reverseVector(vec.begin(),vec.end());
for(auto v:vec)
{
std::cout<<v<<" ";
}
}
输出
1 2 3 4 After reverting
4 3 2 1 Program ended with exit code: 0