假设我有一个类型的变量:
std::map<int,std::vector<std::string>> m;
现在声明A是:
m[2].push_back("SomeString");
和陈述B是:
std::vector<std::string> t = m[2];
m[2]=t.push_back("SomeString");
我想知道B是否恰好相当于A.
我问这个的原因是因为在这个link上它表明STL对象会复制。但是对我来说A语句似乎返回了一个引用。关于这里发生了什么的任何建议?
答案 0 :(得分:2)
operator[]
std::map< class Key, class Value
用于获取与特定键对应的值(实际上,它返回引用,但是w / e)。在您的情况下,您将使用它:
(代码1 )
std::map<std::string,std::vector<std::string>> m;
<...>
std::string the_key_you_need("this is the key");
std::vector< std::string > value = m[the_key_you_need];
value.push_back(<...>)
与以下内容不同:
(代码2 )
std::map<std::string,std::vector<std::string>> m;
<...>
m[the_key_you_need].push_back(<...>);
因为在第一个中,您正在制作m[the_key_you_need]
名为value
的副本,并将新字符串推送到副本,这意味着它不会在m
中结束。第二个是正确的方法。
此外,m[<something>] = value.push_back(<something_else>)
无效,因为vector::push_back()
返回void。如果你想这样做,你需要:
(代码3 )
std::map<std::string,std::vector<std::string>> m;
<...>
std::string the_key_you_need("this is the key");
std::vector< std::string > value = m[the_key_you_need];
value.push_back(<...>)
m[the_key_you_need] = value;//here you are putting the copy back into the map
在这种情况下,代码片段2和3确实是等效的(但代码片段2更好,因为它不会创建不必要的副本)。