我正在尝试使用函数输出向量的值。 “gv”输出的值,但在尝试输出第二个矢量时,“vv”我得到分段错误。有人可以帮助我至少了解发生了什么以及为什么我会收到此错误。我的程序的哪个部分也会发生这种情况。谢谢。另外,我使用的是基于linux服务器的putty编译器
#include <iostream>
#include <vector>
#include <string>
#include <exception>
#include <cmath>
#include <limits>
using namespace std;
vector<int>gv{1, 2, 4, 8, 16, 32, 64, 128, 256, 512}; //global vector
void f(vector<int>a) //function f that takes in a vector argument
{
vector<int>lv(10);
for(int i=0;i<10;i++){ //loop that sets values of gv to lv
lv[i] = gv[i];
cout<< lv[i]<<endl;
}
cout<<'\n';
vector<int>lv2 = a; //loop that assigns the values of the argument vector to lv2
for(int i = 0; i<10; i++){
cout<< lv2[i]<<endl;
}
}
int main() {
f(gv); //function that uses the global variable gv
vector<int>vv(10); //creating a new vecotr vv
for(int i = 1; i<11;++i){ //loop to assign values of the first ten factorials
vv[0] = 1;
vv[i] = vv[i-1]*(i+1);
}
f(vv); //function using vv
}
答案 0 :(得分:1)
vector
在索引时不会自动增长,如果要将项目附加到向量的末尾,请使用push_back
。这将扩展矢量,因为它需要增长。
std::vector<int> vv = {1}; // initializes the vector with one element
for(int i = 1; i < 11; ++i){
vv.push_back(vv[i-1]*(i+1));
}
如果要启动具有特定大小的向量,可以使用带参数的构造函数。
std::vector<int> vv(10); // constructors a vector with 10 elements (all set to 0)
此外,如果您希望检查访问权限,则可以使用vv.at(i)
代替vv[i]
。如果使用无效索引,使用at
将抛出std::out_of_range
。
我建议使用back
而不是索引,这会将你的循环变为:
std::vector<int> vv = {1};
for(int i = 1; i<11;++i) {
vv.push_back(vv.back() * (i+1));
}
使用lv
和gv
的循环也可以重写为基于范围的循环
vectorlv(10);
for(auto&& i : gv) {
lv.push_back(gv[i]);
std::cout<< i << '\n';
}
但如果这就是你所需要的,那么你可以通过执行以下操作来复制矢量,而不是循环。
auto lv = gv;
auto lv2 = a;
答案 1 :(得分:0)
问题在于,当您创建向量时,不会将大小传递给构造函数,因此默认情况下它为零。
vector<int>vv; //creating a new vecotr vv
然后,当您尝试遍历vv
时,您正在访问您不拥有的内存。
另外,在c / c ++语法中,通常括号如下:
for(int i = 0; i < NUM; i++)
{
// Do stuff...
}
而不是Java方式:
for(int i = 0; i < NUM; i++){
//Do stuff...
}