C++使用iter_swap改变向量的顺序

Lit*_*cas 0 c++ stl vector

我将带有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";
}
Run Code Online (Sandbox Code Playgroud)

我最终得到错误:

c ++ vector iterator不可解除引用

有任何想法吗?我没有找到任何能够实现我想要实现的目标的样本.

确实可以使用std :: reverse,我正在进行的赋值要求我使用iter_swap.

int*_*jay 5

list.end()将一个指向过去的最后一个元素.因此,在循环的第一次迭代中,list.end() - i将指向一个结束,并且不能被解除引用(或传递给iter_swap).

您应该使用list.end() - i - 1它,以便从最后一个元素开始.

但是一旦解决了这个问题,你就会遇到另一个问题:你的代码将每个元素交换两次,所以什么都不会改变.你应该停在矢量的中间来解决这个问题.

当然,反转矢量的最佳方法是使用标准功能std::reverse而不是重新发明轮子.