使用iter_swap

时间:2017-10-07 17:26:23

标签: c++ vector stl

我将带有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。

4 个答案:

答案 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