在map中插入任意元素是可以的,但对于vector则不然
inserting an arbitrary element in map is ok, but not for vector
在下面的例子中,在不初始化元素大小的情况下将元素插入空映射是可以的。但在空向量中插入元素是行不通的。规则是什么?在这方面,所有顺序容器都遵循向量的作用,所有相关容器都遵循映射的作用吗?为什么?
map<int, string> t;
t[1] = "string1";
for_each(t.begin(), t.end(), [](pair<int, string> x){cout << "(" << x.first << ", " << x.second << ") " << endl;});
vector<string> vt;
vt[0] = "string1";
for_each(vt.begin(), vt.end(), [](string x){cout << "(" << x << endl;});
这:
t[1] = "string1";
很好,因为映射的operator[]
将为该键插入一个元素(如果不存在)。
此:
vt[0] = "string1";
不好,因为向量的operator[]
只会返回那个特定的元素——不管它是否真的被构造过!如果你只想插入一个新元素,你需要:
vt.push_back("string1");
vt.emplace_back("string1");
甚至:
vt.resize(1);
vt[0] = "string1";
在这方面,所有顺序容器都遵循向量的作用,所有相关容器都遵循映射的作用吗?
对于支持operator[]
的容器,我认为这是通用的方法。当然,并不是所有的顺序容器(例如list
)或关联容器(例如,set
、unordered_set
)都这样做。
下标运算符对std::map
和std::vector
的行为不同
map的下标[]
返回对映射到与key等价的key的值的引用。如果不存在这样的密钥,它将执行插入并返回对它的引用。
矢量的下标[]
返回对指定位置的元素的引用
不执行边界检查。向量[]
运算符从不将新元素插入容器中。
相关文章:
- 有关插入适配器的错误。[错误]请求从 'back_insert_iterator<vector<>>' 类型转换为非标量类型
- 如何有效地在 std::vector 中插入一对?
- 为 std::vector 编写自定义插入函数
- 有没有更快的方法可以在 std::vector 中插入元素
- 在 C++ 中使用 Vector 在动态数组中插入值,循环
- 如何将 n 个连续元素插入到元素类型不可复制的 std::vector 中?
- 在设计方面:重载vector类型的类成员的插入运算符
- 如何在一对集合的向量中插入元素?vector<pair<int,set<string>>>
- C++ 如何在 std::vector 中插入一个连续的间隔范围?
- 将 2D 数组插入 std::vector 时"cannot convert from 'const GLfloat [12]' to '_Objty'"错误消息
- 有没有办法将 vector<unsigned char> 插入 postgresql 表中,具有 bytea 属性,没有 UTF8 编码错误?
- 当使用 std::vector::p ush_back 插入未知数量的元素时,是否应该在每次推送时检查 std::vec
- 如何将对象插入std::vector
- SegFault将插入std :: vector的成员函数插入std :: vector
- 我可以按值(复制)将对象从一个 std::vector 插入到另一个吗?
- vector插入对象的副本或引用
- vector插入新对象
- 如何实现std::vector插入?c++
- stl vector::插入Windows和linux中的差异
- 按字母顺序向vector插入对象