分配std :: vector元素的两种方法
Two ways to assign elements of std::vector
据我所知,可以通过两种方式将元素分配给std::vector
:
vec[i] = value
vec.push_back(value)
但是,第一种方法似乎对vec.size()
没有影响,并且也被随后呼叫vec.push_back()
覆盖。一个最小的例子要证明:
#include <iostream>
#include <vector>
int main()
{
std::vector<unsigned char> things;
things.reserve(2);
things[0] = 'a';
std::cout << "Size after inserting a: ";
std::cout << things.size() << std::endl;
things.push_back('b');
std::cout << "Size after inserting b: ";
std::cout << things.size() << std::endl;
std::cout << "Contents: ";
for (int i=0; i<2; i++)
{
std::cout << things[i] << std::endl;
}
return 0;
}
该程序的输出是:
Size after inserting a: 0
Size after inserting b: 1
Contents: b
所以有人可以解释:
为什么即使在插入
'a'
?
之后,尺寸为0为什么
things.push_back('b')
覆盖'a'
?
注意:我正在使用unsigned char
,因为我已经从正在编写的程序中调整了该代码,该程序涉及操纵这种类型。
预先感谢。
reserve
实际上并未更改向量的大小。它只会改变向量的能力 - 这与实际尺寸不同(有关其实际是什么的说明,请参见此处(。因此,您对things[0] = 'a';
的调用已经超过了向量的大小,因为它仍然具有0尺寸,因此不确定。
如果您致电resize
,则得到此:
Size after inserting a: 2
Size after inserting b: 3
Contents: a
现在,向量包含一个'a'
,A ' '
和'b'
。' '
之所以存在,是因为那是unsigned char
的默认值,因此things.resize(2);
在将一个将一个更改为 'a'
之前,将矢量留下两个。
- 您没有插入它,而是分配给了一个不存在的元素。这具有不确定的行为。分配不会扩展向量。
- 由于向量是空的,因此
push_back
添加了第一个元素。
一个更多信息
std::vector<unsigned char> things;
things.reserve(2);
在下面的分配下,未经检查向量的边界,它将写入事物[0]指向的内存。此操作永远不会失败,但由于内存损坏而导致不确定的行为。
things[0] = 'a'; // 1
下面的分配检查向量的范围,然后写入事物[0]指向的内存。如果索引不在向量范围内并投掷std :: out_of_range'异常。
,它将失败。things.at(0) = 'a' //2
相关文章:
- 定义类模板构造函数的两种方法之间的区别
- 初始化类的两种方法?
- 在没有堆的情况下用两种方法构造对象
- 解决虚拟方法的歧义继承的两种方法
- 这两种方法有什么区别?
- 确保派生的类实现至少是来自抽象类(C )的两种方法之一
- 动态分配一维结构数组:两种方法
- 初始化`rand()的两种方法
- 分配std :: vector元素的两种方法
- 同步QT中两种方法的螺纹执行
- 这两种方法有什么区别
- 关于链表,这两种方法有什么不同?C++中的1个自变量与2个自变量
- 我可以将这两种方法/函数合二为一吗?
- 如何减少googletest的详细程度(覆盖默认侦听器的两种方法)
- 就百分比而言,这两种方法之间的平均性能差异有多大
- 在C++中抛出异常的两种方法(不使用堆)
- 将两种方法组合在一起
- 以下两种方法在 c++ 中有什么区别
- 使用两种方法重写<<运算符
- 函数指针实现的两种方法之间的差异