【问题标题】:different result between c+ set and unordered_setc + set和unordered_set之间的不同结果
【发布时间】:2018-11-24 01:26:08
【问题描述】:

我正在处理 leetcode Frog Jump 问题,当我在以下测试用例中使用 unordered_set 而不是 set 时,我发现了一些连线结果。 unordered_set 和 set 的大小都是 4,但看起来 unordered_set 并没有遍历所有元素。

[0,1,2,3,4,5,6,7,8,9,10,11] 输出 : 设置大小 4 1
2
3
4
无序集大小:4 1

挣扎了几个小时,却找不到任何原因。任何提示都会非常受欢迎。

bool canCross(vector<int>& stones) {
    unordered_map<int, set<int>> dp;
    unordered_map<int, unordered_set<int>> dp1;
    unordered_set<int> s(stones.begin(), stones.end());
    dp[0].insert(0);
    dp1[0].insert(0);

    for (int i = 0; i < stones.size(); ++i) {
        if (i == 10) cout << "set size " << dp[stones[i]].size() << endl;
        for (auto a: dp[stones[i]]) {
            if (i == 10) cout << a << "\t" << endl;
            int b = stones[i];
            if (s.count(b + a - 1)) {
                dp[b + a - 1].insert(a - 1);   
            }
            if (s.count(b + a)) {
                dp[b + a].insert(a);  
            } 
            if (s.count(b + a + 1)) {
                dp[b + a + 1].insert(a + 1);  
            } 
        }

        if (i == 10) cout << "unordered set size: " << dp1[stones[i]].size() << endl;
        for (auto a: dp1[stones[i]]) {
            if (i == 10) cout << a << "\t" << endl;
            int b = stones[i];
            if (s.count(b + a - 1)) {
                dp1[b + a - 1].insert(a - 1);   
            }
            if (s.count(b + a)) {
                dp1[b + a].insert(a);  
            } 
            if (s.count(b + a + 1)) {
                dp1[b + a + 1].insert(a + 1);  
            } 
        }
    }

    return !dp[stones.back()].empty();
}

【问题讨论】:

    标签: c++ set unordered


    【解决方案1】:

    这是因为您的某些插入修改了您当前通过for 循环迭代的同一容器。毫不奇怪,插入setunordered_set 可能最终在容器元素的线性序列中的不同位置。在一个容器中,新元素在当前位置前面结束,随后被循环迭代。在其他容器中,新元素在当前位置之后结束,循环永远不会看到。

    通过基于范围的for 循环来修改您当前正在迭代的容器通常不是一个好主意。在您的情况下,它可能不会产生任何未定义的行为(如果您使用的是具有稳定迭代器的关联容器),但仍然......在我看来,基于范围的 for 应该保留用于迭代不变的容器。

    在您的情况下,将新元素插入std::unordered_set 可能会触发rehashing 并使该unordered_set 的所有迭代器无效。这意味着如果 unordered_set 当前正在被基于范围的 for 迭代,您最终会出现未定义的行为。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-03-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-09
      • 1970-01-01
      相关资源
      最近更新 更多