C++ MSVC 14 STL矢量储备

C++ MSVC 14 STL矢量储备,c++,stl,C++,Stl,我注意到调试x86解决方案中MSVC 14通信上的奇怪行为(IMO)。 当未包含vector::resize时,下面的代码引发异常。 注意:分配后,通过传递nullptr可以取消分配某些实体 vector<Entity*> m_entities; (...) // find empty slot u_int id = m_entities.size(); for(u_int i=0; i<m_entities.size(); ++i) { if(m_entities

我注意到调试x86解决方案中MSVC 14通信上的奇怪行为(IMO)。 当未包含vector::resize时,下面的代码引发异常。 注意:分配后,通过传递nullptr可以取消分配某些实体

vector<Entity*> m_entities;

(...)

// find empty slot
u_int id = m_entities.size();
for(u_int i=0; i<m_entities.size(); ++i)
{
    if(m_entities[i] == nullptr)
    {
        id = i;
        break;
    }
}

// vector realloc
if(id == m_entities.capacity())
{
    u_int newSize = m_entities.capacity() * 2;
    m_entities.reserve(newSize);
    //m_entities.resize(newSize);
}

// assign
entity->m_id = id;
m_entities[id] = entity;
向量m_实体;
(...)
//找到空槽
u_int id=m_entities.size();
对于(u_int i=0;im_id=id;
m_实体[id]=实体;


看起来运算符[]检查的是大小()而不是容量()-我说得对吗?

如果向量未初始化,则无法访问该向量的保留区域。
reserve
不会初始化它仅保留的任何内容(如其名称所示)每次推后一个新项目时,一些内存不会
重新分配
向量

尝试运行以下代码:

#include <iostream>
#include <string>
#include <vector>
class my_class{
    public:
    my_class(){
        x="I am an initialized item";
    }
    std::string x;
};
int main()
{
    std::vector<my_class> v(2);
    v.reserve(3);
    std::cout << v[0].x <<std::endl<< v[1].x <<std::endl <<v[2].x;
}
#包括
#包括
#包括
上我的课{
公众:
我的班级(){
x=“我是一个已初始化的项目”;
}
std::字符串x;
};
int main()
{
std::向量v(2);
v、 储备(3);

std::cout如果未初始化,则无法访问
向量的保留区域。
reserve
不会初始化任何内容,它只是保留了一些内存,以便在每次推后一个新项目时
不会重新分配
向量

尝试运行以下代码:

#include <iostream>
#include <string>
#include <vector>
class my_class{
    public:
    my_class(){
        x="I am an initialized item";
    }
    std::string x;
};
int main()
{
    std::vector<my_class> v(2);
    v.reserve(3);
    std::cout << v[0].x <<std::endl<< v[1].x <<std::endl <<v[2].x;
}
#包括
#包括
#包括
上我的课{
公众:
我的班级(){
x=“我是一个已初始化的项目”;
}
std::字符串x;
};
int main()
{
std::向量v(2);
v、 储备(3);

是的,这是正确的。是的,这是正确的。是的,我知道保留是如何工作的,但如果向量重新分配内存,为什么我不能通过引用的[]运算符访问它。@juanchopanza我的答案有问题吗?“如果n大于当前向量容量,该函数将导致容器重新分配其存储,将其容量增加到n(或更大)。”IMO从现在起应可访问新标记。@Luk No.
[]
只在向量的大小范围内工作,而不是在其容量范围内。容量只是准备了一个不可访问的空间,当向量的大小增加时,它可以在其中增长,因此它不需要重新分配。但是“缓冲区“容量和大小之间不是向量内容的一部分,因此无法访问。很好的例子。现在我看到了这个实现的一些可用结果。是的,我知道保留是如何工作的,但是如果向量重新分配内存,那么为什么我不能通过引用的[]运算符访问它。@juanchopanza我的答案有问题吗?“如果n大于当前向量容量,该函数将导致容器重新分配其存储,将其容量增加到n(或更大)。”IMO从现在起应可访问新标记。@Luk No.
[]
只在向量的大小范围内工作,而不是在其容量范围内。容量只是准备了一个不可访问的空间,当向量的大小增加时,它可以在其中增长,因此它不需要重新分配。但是“缓冲区“容量和大小之间的关系不是矢量内容的一部分,因此无法访问。这是一个很好的例子。现在我看到了这个实现的一些有用的结果。