这是我作为C ++初学者在本网站上发表的第一篇文章。 我的问题很简单。 编写一个反转向量中元素顺序的函数。 例如,1,3,5,7,9变为9,7,5,3,I。反向功能 应该产生一个反向序列的新矢量,留下它的原始 矢量不变。
这是我的代码。当我运行它时,没有任何东西出现在" Printing"之后。我很确定我在某处犯了一个愚蠢而简单的错误但却无法弄明白。非常感谢任何帮助。欢呼。
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("`");
}
答案 0 :(得分:8)
std::vector<int> reverse(std::vector<int>v)
{
std::reverse(v.begin(),v.end());
return v;
}
答案 1 :(得分:7)
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 ++,你应该热心这样做。没有什么比半语言转换更糟糕了: - )
答案 2 :(得分:1)
使用算法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
答案 3 :(得分:0)
您将<=
与>=
混淆。
但使用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中)而不是long类型的好地方:
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());
}
答案 4 :(得分:-1)
您可以尝试使用迭代器交换值。
类似的东西:
Iterator first = vec.begin();
Iterator last = vec.end();
while ((first!=last)&&(first!=--last))
{
std::iter_swap (first,last);
++first;
}