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'
    }
}
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 .尺寸().
Bil*_*nch 20
正如其他答案所指出的那样,矢量的内容保证是连续的(除了布尔的古怪).
我想添加的注释是,如果你对向量进行插入或删除,这可能导致向量重新分配它的内存,那么你将导致所有保存的指针和迭代器失效.
事实上,该标准确保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>是唯一的,错误的标准特化,简单的指针算法将不起作用.)