C++使用iter_swap更改矢量的顺序
C++ changing order of vector using iter_swap
我正在将一个包含 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
相关文章:
- 按字母顺序对字符串中的字母进行排序,而无需使用内置的 sort()
- C++:使用方法调用析构函数的顺序是什么?
- 首先按给定顺序打印所有数字,然后使用 Array 打印所有字符和其他符号
- 如何确定使用的功能顺序?
- 在自定义程序中使用本机 Windows 自然顺序排序
- 如何使用 OpenMP 使线程以相反的顺序写入其数字?
- 从数组中删除非唯一值、保持顺序和不使用向量的最佳方法?
- C++评估顺序优化是否意味着对不同的操作数使用不同的内核?
- 无法弄清楚如何使用 c++ 中的链表按从 a 到 z 的顺序显示字母
- 我已经做了一个程序来使用队列链C++表显示学生姓名和身高,现在我想以我不知道如何显示的顺序显示它
- 如何使用QSortFilterProxyModel按字母顺序对列表项进行排序
- C++使用相反的顺序打印带有逗号的列表
- 使用 while 循环显示顺序变量的值
- 验证(使用 static_assert)元组类型是否遵循某种顺序(有状态编译时检查)
- 使用constexpr的全局初始化顺序
- 使用枚举类型管理存储顺序
- 使用二叉树的关卡顺序概念的垂直顺序遍历
- 如何从OpenCV中的目录中按顺序读取文件并使用它进行处理?
- C++ 从文件中获取数据时使用 strcpy 和 strcmp 按字母顺序对数组进行排序?
- 试图以相反的顺序使用extern