我目前正在尝试学习一些C ++,现在我陷入了使用向量的练习中。因此,任务是从文本文件中读取整数并将它们存储在应该是动态的向量中。
我想while循环有问题吗? 如果我开始这个,程序失败,如果我将矢量大小设置为6,我得到 6 0 0 0 0 0作为输出。
感谢任何提示。
int main()
{
const string filename = "test.txt";
int s = 0;
fstream f;
f.open(filename, ios::in);
vector<int> v;
if (f){
while(f >> s){
int i = 0;
v[i] = s;
i = i+1;
}
f.close();
}
for(int i = 0; i < 6; i++){
cout << v[i] << "\n";
}
}
答案 0 :(得分:2)
你不会长出载体。它是空的,无法容纳任何int
个。您每次要添加其他int
时都需要调整大小,或者使用自动放大矢量的push_back
。
您为每次迭代设置i = 0
,因此您可以在每次迭代而不是下一次迭代时更改向量的第一个值。
Go for:
v.push_back(s);
在你的循环中
for(int i = 0; i < v.size(); i++) { // ...
注:
您通常不会对矢量大小/边界进行硬编码。使用
std::vector
的一个主要观点是它能够根据其大小动态行为。因此,处理向量的代码不应对有关对象的大小施加任何限制。示例:
for(int i = 0; i < 6; i++){ cout << v[i] << "\n"; }
要求向量至少有6个元素,否则(少于6个整数)可以访问超出范围的值(如果
v
包含的值超过6,则可能会遗漏元素)。使用
for(int i = 0; i < v.size(); i++){ cout << v[i] << "\n"; }
或
for(std::vector<int>::const_iterator i = v.begin(); i != v.end(); ++i) { cout << *i << "\n"; }
或
for(auto i = v.begin(); i != v.end(); ++i) { cout << *i << "\n"; }
或
for(int x : v){ cout << x << "\n"; }
或
for(auto && x : v){ cout << x << "\n"; }
或
std::for_each(v.begin(), v.end(), [](int x){ std::cout << x << "\n"; });
或以上可能预先存储
的变体v.size()
或v.end()
或任何您喜欢的内容,只要您不对矢量的动态大小施加任何限制。
答案 1 :(得分:0)
错误就是这一行int i = 0;
因为你每次在while循环中声明i = 0。
要纠正这一点,请将此行从循环外移动。
注意:如果您将v声明为普通数组,例如int v[101]
,则此方法可行
当您使用std vectors
时,您可以使用v.push_back(element);
答案 2 :(得分:0)
问题出在i= 0
行。修复这将在行v[i] = s
中出现问题。
您总是在while循环中将i
初始化为0
,并且负责当前输出。你应该把它从while循环中移开。
修复之后,你还没有为那个向量分配内存,所以v[i]
没有意义,因为它会超出边界访问内存。这将产生分段错误。相反,它应该是v.push_back(i)
,因为它会将元素添加到向量的末尾,并在需要时分配内存。
答案 3 :(得分:0)
如果您使用std::vector
,则可以使用v.push_back(i)
填充此向量
答案 4 :(得分:0)
v[i] = s; //error,you dont malloc room for vector
更改为:v.push_back(s);