在修改 <some_container> 的大小时迭代 std::vector<some_container> 安全吗?
Safe to iterate over std::vector<some_container> while modifying <some_container>'s size?
假设我有一个其他容器类型的向量。在迭代向量时,我更改了容器的大小。鉴于向量试图在系统内存中保持连续,指针算法会在这样的循环中失败吗?例如,
#include <stdlib.h>
#include <vector>
using namespace std;
int main(){
vector<vector<double> > vec_vec(4);
for (auto i=vec_vec.begin(); i!=vec_vec.end(); ++i){
for (double j=0; j<100; j+=1.0){
i->push_back(j)
};
};
return 0;
}
到目前为止,我在使用这样的代码时没有遇到任何问题,但现在我想知道我是否只是走运。这样安全吗?它取决于向量中使用的容器类型吗?
完全没问题,您没有更改外向量。但是,不能保证所有向量在内存中都是连续的。每个人内心一个都会,但不要指望他们在记忆中一个接一个地排列。
向量是固定大小的管理对象(大小、保留、指针),其连续内存由指针指向。
因此您没有更改对象的大小
您正在修改您正在迭代的 std::vector
的内容。没有你正在迭代的向量。它们是不同的东西。
第一个是安全的。由于最终的内存重新分配,第二个将不安全。
假设我有一个其他容器类型的向量。在迭代向量时,我更改了容器的大小。鉴于向量试图在系统内存中保持连续,指针算法会在这样的循环中失败吗?例如,
#include <stdlib.h>
#include <vector>
using namespace std;
int main(){
vector<vector<double> > vec_vec(4);
for (auto i=vec_vec.begin(); i!=vec_vec.end(); ++i){
for (double j=0; j<100; j+=1.0){
i->push_back(j)
};
};
return 0;
}
到目前为止,我在使用这样的代码时没有遇到任何问题,但现在我想知道我是否只是走运。这样安全吗?它取决于向量中使用的容器类型吗?
完全没问题,您没有更改外向量。但是,不能保证所有向量在内存中都是连续的。每个人内心一个都会,但不要指望他们在记忆中一个接一个地排列。
向量是固定大小的管理对象(大小、保留、指针),其连续内存由指针指向。
因此您没有更改对象的大小
您正在修改您正在迭代的 std::vector
的内容。没有你正在迭代的向量。它们是不同的东西。
第一个是安全的。由于最终的内存重新分配,第二个将不安全。