发新话题
打印

对 std::map<string,string> m; 是否可以 auto x = m["abc"];

对 std::map<string,string> m; 是否可以 auto x = m["abc"];

std::map m; auto x = m["abc"];

如果可以,那么对 map 有这样的定义:
template<keytype,valuetype,.>
class map {
valuetype & operator[](const keytype &); // 这个最有可能
valuetype & operator[](keytype ); // 这种总会生成临时对象,效率太低
valuetype & operator[](const char *); // 这样当然可以使上面调用成立,但要考虑到map是一个模板类,
                 // 它的键类型,可以是字符串,也可以是其它类型,如对map<int,string> 按"abc" 取到值,是什么鬼?
}

但跟了一下源代码,到string的移动构造函数里去了,什么情况?

TOP

实际是,map还定义了两个版本,用来取值:

valuetype& operator[](keytype&& _Keyval); // 移动版本, 
valuetype & operator[](const keytype &); // 常量引用版本

auto x = m["abc"]; // 等价: auto x=m[string("abc")]
                              // 先用“abc”初始化一个string ,然后调用 移动版本 取值

string k="abc"; // 先初始化string,
auto x = m[k];// 调用常量引用版本取值

两者方法,执行效率有差吗? 没有,都需要生成一个临时string 对象,
当然,移动版本更简洁

* 移动版本特别钟爱临时对象,如影随形!临时对象没有名份,用完即扔,惨

TOP

发新话题