我这里有这段代码。
map<int, int[2]> m;
map m被初始化。以下代码尝试为密钥添加新值。
while(scanf("%d %d %d %c", &a,&b,&c,&d) == 1){
map<int, int[2]>::iterator it = m.find(a);
if(!(it == m.end())){
//found
if(d == 'C') { (it->second)[0]+=1; (it->second)[1] += c;}
if(d == 'I') { (it->second)[1] += 20;}
} else {
//not found
if(d == 'C') {int arr[2] = {1, c}; m[a] = arr;}
if(d == 'I') {int arr[2] = {0, 20}; m[a] = arr;}
}
}
但是,m[a] = arr;
给出了以下错误:expression必须是可修改的左值。
这是什么意思?
答案 0 :(得分:1)
内置数组不可分配,在现代C ++中通常最好避免使用。请改用std::array<int, 2>
,这是可以复制的:
map<int, std::array<int, 2>> m;
while(scanf("%d %d %d %c", &a,&b,&c,&d) == 1){
auto it = m.find(a);
if(!(it == m.end())){
//found
if(d == 'C') { (it->second)[0]+=1; (it->second)[1] += c;}
if(d == 'I') { (it->second)[1] += 20;}
} else {
//not found
if(d == 'C') {std::array<int, 2> arr = {1, c}; m[a] = arr;}
if(d == 'I') {std::array<int, 2> arr = {0, 20}; m[a] = arr;}
}
}
答案 1 :(得分:0)
int[2]
不适合作为std::map
的值(映射类型),因为您无法将该类型的对象分配给该类型的另一个对象。
int a[2];
int b[2];
b = a; // Not allowed.
您可以使用std::array<int, 2>
作为替代品。
map<int, std::array<int, 2>> m;
答案 2 :(得分:0)
这是因为你不能简单地使用赋值复制c风格的数组。
您可以将数组包装在一个结构中,该结构将复制OK,或使用std::array<int,2>
作为您的类型。
答案 3 :(得分:0)
另一种选择是使用std::pair<int, int>
作为值:
map<int, std::pair<int, int>> m;
while(scanf("%d %d %d %c", &a,&b,&c,&d) == 1){
auto it = m.find(a);
if(!(it == m.end())){
//found
if(d == 'C') { (it->second).first +=1; (it->second).second += c;}
if(d == 'I') { (it->second).second += 20;}
} else {
//not found
if(d == 'C') {m[a] = {1, c};}
if(d == 'I') {m[a] = {0, 20};}
}
}