我试图以相反的顺序返回一个带有值的向量(例如,我输入一个带有0,1,2,3,4的向量,该函数返回一个带有4,3,2,1,0的向量)。
编译器说:分段错误。
在我的测试中,我发现可能我的问题出在作业new2 = ret_vec(numbers);
中,但我不知道发生了什么。
#include <string>
#include <iostream>
#include <vector>
using namespace std;
vector<int> ret_vec(vector<int>n){
vector <int> n2;
for (int i = 0; i< n.size(); ++i){
n2[i] = n[i];
}
return n2;
}
void initializer(int s, vector<int>& n){
for (int i = 0; i< s; ++i){
n.push_back(i);
}
}
void print_vector(vector<int> n){
for (int i = 0; i<n.size(); ++i){
cout << n[i] << " ";
}
}
int main () {
vector <int> numbers;
int size;
cin >> size;
initializer(size,numbers);
vector <int> new2(numbers.size());
cout << "Old ";
print_vector(numbers);
new2 = ret_vec(numbers);
cout << "New ";
print_vector(new2);
return 0;
}
答案 0 :(得分:9)
我正在尝试以相反的顺序返回带有值的向量
最简单的方法是使用C ++:
vector<int> reverse_vec(const vector<int>& n)
{
vector<int> ret(n.rbegin(), n.rend());
return ret;
}
这里,反向迭代器用于构造一个向量,其中输入向量的内容被反转。或者,如果要反转矢量,请使用std::reverse
:
vector<int> v = ....
std::reverse(v.begin(), v.end()); // v is now reversed
至于你的代码问题,一个显而易见的问题是你在这里访问一个超出范围的向量:
vector <int> n2; // empty vector
for (int i = 0; i< n.size(); ++i){
n2[i] = n[i]; // oops! n2 accessed out of bounds!
}
修复程序根本不使用此代码,而是选择简单的选项。
答案 1 :(得分:1)
在以下功能中
vector<int> ret_vec(vector<int>n){
vector <int> n2;
for (int i = 0; i< n.size(); ++i){
n2[i] = n[i];
}
return n2;
}
您只需复制参数向量的内容即可。 (我忘记了参数和它的典型之间的空格)
你也可以这样颠倒顺序(它反过来“手动”):
vector<int> ret_vec(vector<int> n){
vector <int> n2;
for(int i=n1.size()-1; i<=0; --i)
{
n2.push_back(n1[i]);
}
return n2;
}