C++ MSVC 14 STL矢量储备
我注意到调试x86解决方案中MSVC 14通信上的奇怪行为(IMO)。 当未包含vector::resize时,下面的代码引发异常。 注意:分配后,通过传递nullptr可以取消分配某些实体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
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.[]
只在向量的大小范围内工作,而不是在其容量范围内。容量只是准备了一个不可访问的空间,当向量的大小增加时,它可以在其中增长,因此它不需要重新分配。但是“缓冲区“容量和大小之间的关系不是矢量内容的一部分,因此无法访问。这是一个很好的例子。现在我看到了这个实现的一些有用的结果。