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;
}