我正在使用的程序的一部分需要将字符串值附加到向量。当附加字符串值时,我达到了分段错误:
for(int i = 0; i < testvec.size(); i++) {
testvec[i] = oldvec[i];
}
但我的程序使用以下代码正确编译和执行:
for(int i = 0; i < testvec.size(); i++) {
testvec.push_back(i);
}
这是它的要点,我们正在做的是更新矢量
答案 0 :(得分:0)
operator[]
索引到vector
中已存在的空间。假设您的向量是默认构造的:
std::vector<std::string> v;
然后对任何v[i]
执行i
是未定义的行为,因为无法保证尚未为存储值分配任何空间。它实际上相当于:
std::string *storage;
storage[i] = "...";
您的代码看起来仍然不正确:我猜它实际上是这样的:
for(int i = 0; i < oldvec.size(); i++) {
testvec.push_back(oldvec[i]);
}
这是解决问题的漫长道路:构建一个包含在另一个向量中的元素的向量,最简单的方法是:
std::vector<std::string> testvec(oldvec.begin(), oldvec.end());
答案 1 :(得分:0)
push_back()
是将项目附加到向量的正确方法。它将根据需要重新分配底层内存块以适应新项目。但是,operator[]
不会增加向量,因此如果先前使用resize()
调整了向量或使用push_back()
插入,则只能插入新项目。如果您尝试不使用operator[]
,则会导致未定义的行为。