使用push_back附加到向量而不是[]

时间:2014-04-16 01:27:34

标签: string c++11 vector

我正在使用的程序的一部分需要将字符串值附加到向量。当附加字符串值时,我达到了分段错误:

for(int i = 0; i < testvec.size(); i++) {
    testvec[i] = oldvec[i];
}

但我的程序使用以下代码正确编译和执行:

for(int i = 0; i < testvec.size(); i++) {
    testvec.push_back(i);
}

这是它的要点,我们正在做的是更新矢量

2 个答案:

答案 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[],则会导致未定义的行为。