我有一个这样的课程:
classA
{
public:
classA()
{
//Here I am doing something but nothing related to vector
}
void updateVec(int idx, int value)
{
//Here, I want to update vector vector based on args passed
myVec.insert(myVec.begin() + idx, value);
}
std::vector<int> myVec;
}
现在,我在insert语句中遇到分段错误。我需要在某处初始化矢量吗?
答案 0 :(得分:3)
分段错误意味着您正在尝试访问/写入尚未(尚未)分配的内存。在您的情况下,根据idx
的值,myVec.begin() + idx
可以指向向量分配区域之外的内存。在插入之前,您需要确保您的向量至少可以容纳idx
个元素。 updateVec
应该检查向量的当前大小,如果它不够大,它应该调用vector::reserve
来分配足够的空间,以便插入新元素。
答案 1 :(得分:2)
您的代码似乎没有正确初始化它。
初始化用作本地var
创建一个大小为3的整数向量,初始化为0
std::vector<int> myvector (3,0);
如何在类的构造函数中初始化(然后调整大小)向量的简短示例
#include <iostream>
#include <vector>
class A {
public:
A(int size);
~A();
void updateVec(int idx, int value);
void print();
private:
std::vector<int> myVec;
};
A::A(int size) {
myVec.resize(size);
}
A::~A() {
}
void A::updateVec(int idx, int value) {
myVec.insert(myVec.begin() + idx, value);
}
void A::print() {
std::vector<int>::iterator it;
for (it=myVec.begin(); it!=myVec.end(); it++) {
std::cout << " " << *it;
}
}
int main() {
A* a = new A(10);
a->updateVec(2,10);
a->print();
}
以下是有关如何在C ++中使用向量的文档/示例
http://www.cplusplus.com/reference/stl/vector/insert/
答案 2 :(得分:0)
是的,你这样做。向量开始为空。任何尝试访问超过向量结尾的项目都将导致错误。
要建议一个解决方案,我们需要知道矢量是否需要动态改变大小 - 或者它是否是固定大小,在什么时间点你会知道它需要的大小。
另外,如果您更新向量的第17个元素,但当时它只包含10个项目,您是否还要创建项目11到16?