在地图中插入任意元素是可以的,但不适用于矢量

时间:2015-06-26 02:16:19

标签: c++ stl

在以下示例中,将元素插入空地图而不初始化其大小是可以的。但是在空向量中插入元素将不起作用。规则是什么?在这方面,所有顺序容器都遵循向量所做的,并且所有关联的容器都遵循映射的作用吗?为什么?

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;});

2 个答案:

答案 0 :(得分:3)

此:

t[1] = "string1";

很好,因为如果一个人不在场,地图operator[]会插入一个元素。

此:

vt[0] = "string1";

不正常,因为矢量&#39; operator[]只会返回该特定元素 - 无论它是否真正构建过!如果您只想插入一个新元素,您需要:

vt.push_back("string1");
vt.emplace_back("string1");

甚至:

vt.resize(1);
vt[0] = "string1";
  

在这方面,所有顺序容器都遵循向量的作用,所有关联的容器都遵循映射的作用吗?

对于支持operator[]的容器,我认为这是一般方法。当然,并非所有顺序容器(例如list)或关联容器(例如setunordered_set)都可以。

答案 1 :(得分:1)

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

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

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