C++使用iter_swap更改矢量的顺序

C++ changing order of vector using iter_swap

本文关键字:顺序 使用 iter swap C++      更新时间:2023-10-16

我正在将一个包含 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++ 向量迭代器不可取消引用

有什么想法吗?我还没有找到任何可以实现我想要实现的目标的样本。

std::reverse确实可以使用,我正在处理的任务要求我使用iter_swap。

list.end()指向向量的最后一个元素。因此,在循环的第一次迭代中,list.end() - i将指向一个末尾,并且不能取消引用(或传递给iter_swap)。

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

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

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

也许你应该只使用 std::reverse

我设法通过以下方式解决了这个问题:

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的唯一原因是因为我正在处理的任务需要它。

您可以使用

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