在以下示例中,将元素插入空地图而不初始化其大小是可以的。但是在空向量中插入元素将不起作用。规则是什么?在这方面,所有顺序容器都遵循向量所做的,并且所有关联的容器都遵循映射的作用吗?为什么?
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;});
答案 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
)或关联容器(例如set
,unordered_set
)都可以。
答案 1 :(得分:1)
下标运算符对std::map
和std::vector
的行为有所不同。
map的下标[]
返回对映射到与key等效的键的值的引用。如果不存在这样的密钥,它将执行插入并返回对它的引用。
向量的下标[]
返回对指定位置的元素的引用。
不进行边界检查。向量[]
运算符从不将新元素插入容器中。