c++ - 无法理解 STL 映射的行为

标签 c++ dictionary stl

我有一个这样声明的 STL 映射:

std::map< std::pair<int, int>, long long> m;

如果我这样做:

m.insert( make_pair( make_pair(1,1), 1000ll ));

其次是:

cout << m[make_pair(1,1)] << endl;

它在终端写入 0。

但是:

m[make_pair(1,1)] = 1000ll;

工作正常。

据我所知,在 map 中插入元素的第一种方式是推荐的方式。 我错过了什么?

编辑:

#include <vector>
#include <algorithm>
#include <iostream>
#include <map>
#include <numeric>
using namespace std;

long long max_partition(    vector<long long> numbers, int numbers_size, int partition_number, map<pair<int, int>, long long> &subproblems)
{
    long long v = subproblems[make_pair(numbers_size, partition_number)];
    if( v ){
        cout << "SP" << endl;
        return v;
    }

    if(partition_number == 1) {
        long long s = accumulate(numbers.begin(), numbers.begin() + numbers_size, 0ll);
        subproblems.insert(make_pair( make_pair(numbers_size, partition_number), s) ); 
        return s;
    }

    if(numbers_size == 0) {
        subproblems.insert(make_pair( make_pair(numbers_size, partition_number), numbers[0])); 
        return numbers[0];
    }

    long long max_p = 500 * 10000000l;

    for(int i = partition_number - 1; i < numbers_size; i++) {
        long long acc = accumulate(numbers.begin() + i, numbers.begin() + numbers_size, 0ll) ;  
        long long mp = max_partition(numbers, i, partition_number - 1, subproblems);
        max_p = min(max_p, max(mp, acc));
    }

    subproblems.insert(make_pair( make_pair(numbers_size, partition_number), max_p) ); 
    //subproblems[make_pair(numbers_size, partition_number)] = max_p;
    return max_p;
}


int main(int argc, char **argv)
{
    map<pair<int, int>, long long> subproblems;
    long long arr[] = {50, 50, 50, 50, 50}; //, 40, 50};
    vector<long long> p(arr, arr + 5);
    max_partition(p, 5, 4, subproblems);

    map<pair<int, int>, long long>::iterator it;

    for(it = subproblems.begin(); it != subproblems.end(); it++)
        cout << "val: " << it->second << endl;


    return 0;
}

最佳答案

函数的开头已经将元素插入到 map 中(如果元素之前不存在,operator[] 将为您插入元素):

long long v = subproblems[make_pair(numbers_size, partition_number)];

您稍后尝试再次插入该元素:

subproblems.insert(make_pair( make_pair(numbers_size, partition_number), max_p) );

但是插入失败,因为元素已经存在,并且 std::map<>::insert 的契约(Contract)是如果它已经存在,它将保持不变。

第一个检查似乎是在调用此函数之前尝试测试该元素是否存在于 map 中,如果是这样,您可以使用 find :

iterator it=subproblems.find(make_pair(numbers_size,partition_number));
if (it != subproblems.end()) {
   return it->second;
}

尽管当您执行真正的 insert 时需要再次查找.另一种方法是直接在开头尝试插入,并使用结果来测试元素是否已经存在并作为迭代器使用:

pair<iterator,bool> r = subproblems.insert(
                           make_pair(make_pair(numbers_size,partition_number),0));
if (!r.second) {             // existed before
    return r.first->second;  // return that value
}
...
r.first->second = numbers[0]; // replaces the insert in your code

关于c++ - 无法理解 STL 映射的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19715669/

相关文章:

c++ - 交换后 vector 会保持连续吗?

C++ Vector 内容被删除?

c++ - SDL_WM_SetCaption 不工作

c++ - map 中的循环迭代器

c++ - 尝试在 C++ 中实现固定大小队列时出现段错误

c++ - 使用 nlohmann json 进行 JSON 解析

python - Pandas :替换字典中的完整匹配字符串

python - 将 lambda 函数应用于具有 NaN 值的数据框?

python - 使用预定义的 header 将列表字典转换为 pandas.DataFrame

c++ - <STL_hashtable> 中是否不需要构造函数参数