C ++将地图值设置为数组

时间:2018-05-30 19:27:32

标签: c++11 dictionary

我这里有这段代码。

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必须是可修改的左值。

这是什么意思?

4 个答案:

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