std :: vector元素是否保证是连续的?

Mar*_*ote 104 c++ standards vector

我的问题很简单:std :: vector元素是否保证是连续的?在order word中,我可以使用指向std :: vector的第一个元素的指针作为C数组吗?

如果我的记忆力很好,那么C++标准就没有这样的保证.但是,如果元素不连续,那么std :: vector要求几乎不可能满足它们.

有人可以澄清一下吗?

例:

std::vector<int> values;
// ... fill up values

if( !values.empty() )
{
    int *array = &values[0];
    for( int i = 0; i < values.size(); ++i )
    {
        int v = array[i];
        // do something with 'v'
    }
}
Run Code Online (Sandbox Code Playgroud)

dir*_*tly 110

这是从C++ 98标准中错过的,但后来作为TR的一部分添加.即将推出的C++ 0x标准当然会将其作为一项要求.

从n2798(C++ 0x草案):

23.2.6类模板向量[向量]

1 vector是一个支持随机访问迭代器的序列容器.此外,它支持(摊销)最后的恒定时间插入和擦除操作; 在中间插入和擦除需要线性时间.存储管理是自动处理的,但可以提供提示以提高效率.向量的元素是连续存储的,这意味着如果v是一个向量,其中T是某种类型而不是bool,那么它服从所有0 <= n <v的身份&v [n] ==&v [0] + n .尺寸()​​.

  • 这也在ISO 14882第2版中说明:第23.2.4节[lib.vector]:"向量的元素是连续存储的,这意味着如果v是向量<T,分配器>其中T是某种类型而不是bool,然后它服从所有0 <= n <v.size()的身份&v [n] ==&v [0] + n." (3认同)
  • 所以s,TR,TC,:)实际上C++ 03也被称为C++ 98-TC1(技术勘误) (3认同)
  • 向量的向量呢?内部向量紧跟在最后一组的内部向量之后? (2认同)
  • @huseyin tugrul buyukisik 这当然是真的,但后续`std::vector`的实例是连续的。例如:在`std::vector&lt;std::vector&lt;int&gt;&gt; v`中,元素`v[0]`,`v[1]`,...随后存储在内存中,但是元素`v不保证 [0].back()` 和 `v[1].front()` 是。 (2认同)

Bil*_*nch 20

正如其他答案所指出的那样,矢量的内容保证是连续的(除了布尔的古怪).

我想添加的注释是,如果你对向量进行插入或删除,这可能导致向量重新分配它的内存,那么你将导致所有保存的指针和迭代器失效.

  • 这些元素仍将存储在连续的内存块中,只是位于不同的位置。这个问题具体是关于连续性的。 (2认同)
  • 但是现有的指针和迭代器将无效. (2认同)

Mot*_*tti 8

事实上,该标准确保a vector在内存中是连续的,并且&a[0]可以传递给C期望数组的函数.

这个规则的例外是vector<bool>每个只使用一个比特,bool虽然它确实有连续的存储器但它不能用作a bool*(这被广泛认为是错误的优化和错误).

顺便说一句,你为什么不使用迭代器?这就是他们的目的.


小智 6

正如其他人已经说过的,vector内部使用连续的对象数组.只要任何非const成员函数被称为IIRC,就应将指向该数组的指针视为无效.

但是,有一个例外!!

vector<bool>有一个专门的实现旨在节省空间,所以每个bool只使用一位.底层数组不是bool的连续数组,并且数组算术vector<bool>不会像vector<T>那样工作.

(我想也有可能这对于vector的任何特化都可能是正确的,因为我们总是可以实现一个新的.但是,这std::vector<bool>是唯一的,错误的标准特化,简单的指针算法将不起作用.)