C++如何反转矢量中元素的顺序
C++ How to reverse the order of elements in vector?
这是我作为C++初学者在这个网站上的第一篇帖子。我的问题很简单。编写一个函数,使向量中元素的顺序相反。例如,1,3,5,7,9变为9,7,5,3,I。反函数应该生成一个具有相反序列的新矢量,保留其原始序列矢量不变。
这是我的密码。当我运行它时,"打印"一词后面没有任何内容。我很确定我在某个地方犯了一个愚蠢而简单的错误,但就是想不通。如果有任何帮助,我将不胜感激。干杯
void reverse_a(const vector<int>&v1, vector<int>&v2)
{
//this function creates vector2 with the reverse sequence of elements from vector 1
for(int i=v1.size()-1;i<=0;--i)
{
v2.push_back(v1[i]);
}
}
void print(const vector<int>&v)
{
cout<<"Printing"<<endl;
for(int i=0;i<v.size();++i)
cout<<v[i]<<",";
cout<<"n"<<"end of print.n";
}
int main()
{
vector<int>v1;
vector<int>v2;
int input;
while(cin>>input)
v1.push_back(input);
reverse_a(v1,v2);
print(v2);
keep_window_open("`");
}
std::vector<int> reverse(std::vector<int>v)
{
std::reverse(v.begin(),v.end());
return v;
}
for(int i=v1.size()-1;i<=0;--i)
// ^^^^
中间位i <= 0
是continuation子句,并且必须为true,循环才能迭代。除非你的向量为空或大小为1,否则它永远不会是真的,在这种情况下,当你试图访问v1[-1]
时,你会遇到错误。
将<=
更改为>=
。
请注意,我也不太喜欢传递要修改的向量(即使是作为参考),因为不能保证函数中不会有什么东西。我认为在函数中创建新的目标向量并将其传递回去更有意义,比如:
#include <iostream>
#include <vector>
using namespace std;
vector<int> reverse_a (const vector<int> &v1) {
vector<int> v2;
size_t i = v1.size();
while (i > 0)
v2.push_back (v1[--i]);
return v2;
}
void print (const vector<int> &v) {
cout << "Printing" << endl;
for (size_t i = 0; i < v.size(); ++i)
cout << v[i] << ",";
cout << "nEnd of print.n";
}
int main (void) {
int input;
vector<int> v1;
while (cin >> input)
v1.push_back (input);
vector<int> v2 = reverse_a (v1);
print (v2);
return 0;
}
您还会注意到,我已经更改为使用size_t
作为索引类型,并进行了调整以确保它不会变为负数。
当然,这一切都是假设你正在尝试学习相对简单的编程概念。专业的C++程序员可能会使用迭代器来填充一个新的向量,如下所示:
vector<int> reverse_a (vector<int> &v1) {
vector<int> v2;
vector<int>::iterator it = v1.end();
while (it != v1.begin())
v2.push_back (*(--it));
return v2;
}
或者使用极简主义(除了标准库调用之外,不需要任何函数调用):
vector<int> v2 (v1.rbegin(), v1.rend());
一旦你致力于学习C++,你就应该兴致勃勃地学习。没有什么比半转换到语言更糟糕的了:-)
使用算法reverse
。它需要双向迭代器,所以您可以传递begin()
和end()
:
int main(void)
{
std::vector<int> v{1, 2, 3, 4};
std::cout << "vector: ";
for (int i: v)
std::cout << i << ", ";
std::cout << "n";
std::reverse(v.begin(), v.end());
std::cout << "reversed vector: ";
for (int i: v)
std::cout << i << ", ";
std::cout << "n";
return 0;
}
如果您需要副本,请转到:reverse_copy
您混淆了<=
和>=
。
但使用reverse_iterator
会使的工作更简单
void reverse_a(const std::vector<int>&v1, std::vector<int>&v2)
{
v2.clear();
for (std::vector<int>::const_reverse_iterator it = v1.rbegin(); it != v1.rend(); ++it) {
v2.push_back(*it);
}
}
注意:这是一个使用auto
(在C++11中)而不是这里的长类型的好地方
for (auto it = v1.rbegin(); it != v1.rend(); ++it)
代码甚至可以简化为:
void reverse_a(const std::vector<int>&v1, std::vector<int>&v2)
{
v2.assign(v1.rbegin(), v1.rend());
}
您可以尝试使用迭代器交换值。
类似于:
Iterator first = vec.begin();
Iterator last = vec.end();
while ((first!=last)&&(first!=--last))
{
std::iter_swap (first,last);
++first;
}
- 为什么用户定义的函数不按照给定的顺序对相同长度的元素进行排序?
- 快速排序 - 三个中位数枢轴选择 - 某些元素顺序不正确
- 序列容器 - 只能按顺序访问元素
- 如何检查 2 个 c++ 数组在 O(1) 或 O(log n) 时间复杂度中是否相同(所有元素都相同,顺序很重要)?
- 保留从一个多集复制到另一个多集的元素的顺序
- 如何在 C++ 中将从文本文件中读取的元素推送和弹出到数组中,并按 Revserse 顺序输出堆栈?
- 查找数组的第一个和最后一个索引,其中 from 和 to 元素的顺序总和最大
- 编写一个递归功能,该功能采用数组并以相反顺序显示元素,而无需在末尾启动数组的索引
- 编写链接函数的更短/更有效的方法,该函数按字典顺序添加新元素
- stable_sort不遵守元素的顺序
- 从容器中获取随机元素,该容器在恒定时间内没有严格的元素顺序
- 如何在默认和二维数组中找到顺序扩大元素的位置
- 多重映射是否保证广告顺序与其初始值设定项中给出的元素顺序匹配
- 调用std::nth_element后第n个元素之前的元素顺序
- 如何从向量中删除随机元素而不重复它们并保持元素顺序?C++
- 如何在不更改元素顺序的情况下合并两个unordered_maps
- b树实现中的元素顺序错误
- 提升::p tr_向量改变元素顺序
- Equal_range c++元素顺序
- std::unordered_multimap中的元素顺序