std::vector of std::vectors contiguity
std::vector of std::vectors contiguity
我知道std::vector<T>
在内部连续存储其数据(除非它是std::vector<bool>
)旧的C++03
标准和新C++11
。
很好的堆栈溢出问题,处理这个问题并引用标准:回答,回答。
嵌套向量std::vector <std::vector <T> >
中的数据呢?如何存储?
如果每个内部向量都需要连续存储其数据,那么&v[n] == &v[0] + n for all 0 <= n < v.size()
怎么可能是真的。
稍微不同一点,是否可以"简单"和顺序(通过指针或类似方式)访问存储在这种嵌套结构中的所有元素,就像对一维向量所做的那样?
No.vector
的元素存储在动态分配的内存块中;否则,vector
的容量就无法增加。vector
对象仅包含指向该块的指针。
顺序存储元素的要求仅适用于元素本身,而不适用于这些元素的任何动态分配成员。
回答你的最后一个问题:不。向量的向量的元素不是连续存储的。
请考虑以下代码:
std::vector<std::vector<int> > vv;
.... fill in v[0], v[1], v[2], etc
std::vector <int> & v = vv[1];
v.push_back (23);
如果它们都是连续存储的,那么这将导致 vv[2]、vv[3] 等中的每个元素移动。这怎么可能,因为你只是影响一个向量"v"?
std::vector< std::vector<T> >
是对象的向量,存储在连续的内存块中。不过,这些对象也是向量这一事实无关紧要。
尽管矢量的元素存储在连续的内存块中,但元素所在的内存不是矢量对象本身的一部分。
"是否有可能"简单"和顺序(通过指针或类似方式)访问存储在这种嵌套结构中的所有元素,就像对一维向量所做的那样?"
对于访问std::vector
元素,最好使用operator[]
或at()
方法,而不是检索第一个元素的地址并使用指针算法。对于表示为向量向量的多维数组,我建议您保留使用 operator[]
,它易于使用且易于阅读:myVector[i][j]
。值得一看的是 vector::at vs. vector::operator[] 以及:)
是否可以"简单"和顺序(通过指针或类似方式)访问存储在这种嵌套结构中的所有元素,就像对一维向量所做的那样?
是的,如果:
-
你只需要在向量的末尾添加东西,并且
-
您愿意将向量向量构造替换为自定义数据结构
然后,您可以做的是将所有这些子向量连接到一个连续的缓冲区中,另一个索引缓冲区用于通过顶级入口索引访问它。
有关此内容的更多讨论,以及示例"折叠的矢量矢量"类实现,请参阅我的文章。
- 使用std::multimap迭代器创建std::list
- C++中std::resize(n)和std::shrink_to_fit之间的区别
- 来自 std::list 的迭代器 .end() 按预期返回"0xcdcdcdcdcdcdcdcd"但 .begin()
- C++17复制构造函数,在std::unordereded_map上进行深度复制
- 如何导出包含具有"std::unique_ptr"值的"std::map"属性的
- 从持续时间构造std::chrono::system_clock::time_point
- std::具有相同基类的类的变体
- std::向量与传递值的动态数组
- 使用std::vector的OpenCL矩阵乘法
- std::map<struct,struct>::find 找不到匹配项,但是如果我循环通过 begin() 到 end(),我在那里看到匹配项
- std::condition_variable::wait()如何评估给定的谓词
- 如何获取std::result_of函数的返回类型
- std::原子加载和存储都需要吗
- 将对象移动到std::shared_ptr
- POCO::PostgreSQL:如何将std::vector支持添加到`Binder::bind`
- 使用一个考虑到std::map中键值的滚动或换行的键
- 如何从 std::atomic 中提取指针 T<T>?
- 为什么 std::unique 不调用 std::sort?
- 使用std::函数映射对象方法
- std::vector of std::vectors contiguity