我是C ++的新手,我有一个问题(对不起,如果它太基本但我想知道)。所以我有这个代码,它应该将向量的每个元素与一个数字相乘:
#include<iostream>
#include "IntCell.h"
#include<vector>
using namespace std;
vector<float> MatMult(int a, vector<float> & b)
{
vector<float> c;
int i;
for(i=0;i<=b.size();i++){
c[i]=b[i]*a;
}
return c;
}
int main()
{int a=3;
vector<float> b{1,2,3,4,5};
vector<float> c = MatMult(a,b);
cout<<c[2];
}
它编译得很好,但是我得到了分段错误:11。它出了什么问题? 谢谢!
答案 0 :(得分:3)
如果你有一个合理的当前编译器,这更简单。取值vector
乘以值并乘以基于范围的for循环以避免超出范围的错误。
vector<float> MatMult(int a, vector<float> b)
{
for (float& value : b) {
value *= a;
}
return b;
}
这可以作为模板功能更通用。请注意,下面的代码几乎肯定可以改进。
template <typename T>
vector<T> MatMult(int a, vector<T> b)
{
for (auto& value : b) {
value *= a;
}
return b;
}
答案 1 :(得分:2)
你不能c[i]
,因为还没有这样的索引。您最好使用c.push_back(b[i] * a)
编写c.reserve(b.size())
或预分配内存。
还有什么,b.size()
会返回向量中的元素数,而不是最大的索引,因此您应该使用i < b.size()
而不是{{1} }}。
答案 2 :(得分:2)
vector<float> c;
创建一个空向量。然后,您在c[i]=b[i]*a;
中使用它,这是未定义的行为,因为c[anything]
不存在。
如果您想使用c
,则需要将b
设为与c[i]=b[i]*a;
相同的尺寸。那看起来像是:
vector<float> MatMult(int a, vector<float> & b)
{
vector<float> c(b.size());
for(int i = 0; i < b.size(); i++){
// ^ use < here since b[b.size()] is out of bounds
c[i]=b[i]*a;
}
return c;
}
答案 3 :(得分:1)
除了给出的其他答案之外,如果您正在访问超出范围的向量,立即发现的一种方法是首先使用vector::at()
开发而不使用[]
。
vector<float> MatMult(int a, vector<float> & b)
{
vector<float> c;
int i;
for(i=0;i<=b.size();i++){
c.at(i) = b.at(i) * a;
}
return c;
除了分段错误之外,您还会获得out_of_range
异常,从而为您提供有关问题的更多信息。一旦摆脱了所有out_of_range
错误,您就可以切换到使用[]
。