在map中插入任意元素是可以的,但对于vector则不然

inserting an arbitrary element in map is ok, but not for vector

本文关键字:vector 插入 map 任意 元素      更新时间:2023-10-16

在下面的例子中,在不初始化元素大小的情况下将元素插入空映射是可以的。但在空向量中插入元素是行不通的。规则是什么?在这方面,所有顺序容器都遵循向量的作用,所有相关容器都遵循映射的作用吗?为什么?

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)或关联容器(例如,setunordered_set)都这样做。

下标运算符对std::mapstd::vector的行为不同

map的下标[]返回对映射到与key等价的key的值的引用。如果不存在这样的密钥,它将执行插入并返回对它的引用。

矢量的下标[]返回对指定位置的元素的引用
不执行边界检查。向量[]运算符从不将新元素插入容器中。