map作为const引用的问题

来源:互联网 发布:mac文件储存在哪里 编辑:程序博客网 时间:2024/05/29 15:56
string generateCover(const vector<int>& v,  const map<int, string>& id_image){string cover;for (size_t i = 0; i < v.size(); i++){if (id_image.count(v[i])){cover.append(id_image[v[i]]);}if (i != v.size() - 1){cover.append(",");}}return cover;}

编译时提示

错误 1 error C2678: 二进制“[”: 没有找到接受“const std::map<int,std::string,std::less<_Kty>,std::allocator<std::pair<const _Kty,_Ty>>>”类型的左操作数的运算符(或没有可接受的转换) d:\program\vs2013\oj\oj\oj.cpp 18 1 OJ
 2 IntelliSense:  没有与这些操作数匹配的 "[]" 运算符
            操作数类型为:  const std::map<int, std::string, std::less<int>, std::allocator<std::pair<const int, std::string>>> [ const int ] d:\program\vs2013\OJ\OJ\oj.cpp 18 25 OJ
是因为简单来说,map的[]运算符会在索引项不存在的时候自动创建一个对象,有可能会改变map本身,所以不能够用在一个const map上。

替换成迭代器形式,代码如下:

string generateCover(const vector<int>& v,  const map<int, string>& id_image){string cover;for (size_t i = 0; i < v.size(); i++){map<int, string>::const_iterator it = id_image.find(v[i]);if (it != id_image.end())        {            cover += it->second;        }if (i != v.size() - 1){cover.append(",");}}return cover;}


0 0