以下两个表达式是否等同于映射

时间:2013-08-22 07:36:08

标签: c++

假设我有一个类型的变量:

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语句似乎返回了一个引用。关于这里发生了什么的任何建议?

1 个答案:

答案 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更好,因为它不会创建不必要的副本)。