在不创建副本的情况下访问作为向量成员的地图元素

时间:2012-12-15 20:18:48

标签: c++ map vector

我有以下数据类型

typedef     std::map <std::string.std::string> leaf; 
typedef     std::map <std::string,leaf> child;
typedef     std::vector<child> parent;

现在,如果我想在索引0处访问父元素,并且子元素具有键&#34; x&#34;然后对其值进行一些操作

这样做的第一种方式是:

    parentobject[0]["x"]["r"]

但每当我想要访问该值时,我每次都需要重复这些索引。

这样做的第二种方式是:        std :: string value = parentobject [0] [&#34; x&#34;] [&#34; r&#34;] 然后使用值对象。但是这种方法的问题是这一行会创建字符串的副本。

有没有更好的方法来访问变量而不创建副本?

2 个答案:

答案 0 :(得分:2)

您可以使用引用来避免复制:

std::string & value = parentobject[x][y][z]; 

或者,你可以改为:

//define a lambda in the scope
auto get =  [] (int x, std::string const & y, std::string const & z) 
      -> std::string &
{
    return parentobject[x][y][z];
}

//then use it as many times as you want in the scope
std::string & value = get(0, "x", "r");

get(1, "y", "s") = "modify";

答案 1 :(得分:2)

使用参考:

const std::string& value = parentobject[0]["x"]["r"];

现在您可以在任何地方(在同一块范围内)引用value,而无需再次执行地图查找。

如果确实需要,请删除const

请购买并阅读these books之一,以了解C ++的基本功能。