0

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

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的适当等价物。

我问这个的原因是因为在 SO 上的这个链接上它声明 STL 对象进行复制。然而,对我来说,声明 A 似乎返回了一个参考。关于这里发生的事情有什么建议吗?

4

1 回答 1

2

operator[]onstd::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(<...>);

因为在第一个中,您正在制作named的副本,并将新字符串推入副本中,这意味着它不会以. 第二个是正确的方法。m[the_key_you_need]valuem

此外,m[<something>] = value.push_back(<something_else>)将不起作用,因为vector::push_back()返回无效。如果你想这样做,你需要:

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

于 2013-08-22T07:46:14.833 回答