different result between c+ set and unordered_set












-3















I am working on leetcode Frog Jump question and find some wired result when I use unordered_set instead of set for the following test case. unordered_set and set both have size 4, but looks like unordered_set doesn't loop through all elements.



[0,1,2,3,4,5,6,7,8,9,10,11]
output :
set size 4
1

2

3

4

unordered set size: 4
1



Struggleing for hours but can't find out any reason. Any tips would be really appeciated.



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









share|improve this question



























    -3















    I am working on leetcode Frog Jump question and find some wired result when I use unordered_set instead of set for the following test case. unordered_set and set both have size 4, but looks like unordered_set doesn't loop through all elements.



    [0,1,2,3,4,5,6,7,8,9,10,11]
    output :
    set size 4
    1

    2

    3

    4

    unordered set size: 4
    1



    Struggleing for hours but can't find out any reason. Any tips would be really appeciated.



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









    share|improve this question

























      -3












      -3








      -3








      I am working on leetcode Frog Jump question and find some wired result when I use unordered_set instead of set for the following test case. unordered_set and set both have size 4, but looks like unordered_set doesn't loop through all elements.



      [0,1,2,3,4,5,6,7,8,9,10,11]
      output :
      set size 4
      1

      2

      3

      4

      unordered set size: 4
      1



      Struggleing for hours but can't find out any reason. Any tips would be really appeciated.



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









      share|improve this question














      I am working on leetcode Frog Jump question and find some wired result when I use unordered_set instead of set for the following test case. unordered_set and set both have size 4, but looks like unordered_set doesn't loop through all elements.



      [0,1,2,3,4,5,6,7,8,9,10,11]
      output :
      set size 4
      1

      2

      3

      4

      unordered set size: 4
      1



      Struggleing for hours but can't find out any reason. Any tips would be really appeciated.



      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






      share|improve this question













      share|improve this question











      share|improve this question




      share|improve this question










      asked Nov 24 '18 at 1:26









      user791961user791961

      225




      225
























          1 Answer
          1






          active

          oldest

          votes


















          2














          It happens because some of your insertions modify the same container that you are currently iterating over by a for cycle. Not surprisingly, insertions into setand into unordered_set might end up in different positions in the linear sequence of container elements. In one container the new element ends up in front of the current position and is later iterated over by the cycle. In other container the new element ends up behind the current position and is never seen by the cycle.



          It is generally not a good idea to modify container that you are currently iterating over by a range-based for cycle. It might not produce any undefined behavior in your case (if you are using associative containers with stable iterators), but still... in my opinion range-based for should be reserved for iterating over non-changing containers.



          In your case insertion of a new element into an std::unordered_set may trigger rehashing and invalidate all iterators of that unordered_set. It means that if that unordered_set is currently being iterated over by a range-based for, you end up with undefined behavior.






          share|improve this answer

























            Your Answer






            StackExchange.ifUsing("editor", function () {
            StackExchange.using("externalEditor", function () {
            StackExchange.using("snippets", function () {
            StackExchange.snippets.init();
            });
            });
            }, "code-snippets");

            StackExchange.ready(function() {
            var channelOptions = {
            tags: "".split(" "),
            id: "1"
            };
            initTagRenderer("".split(" "), "".split(" "), channelOptions);

            StackExchange.using("externalEditor", function() {
            // Have to fire editor after snippets, if snippets enabled
            if (StackExchange.settings.snippets.snippetsEnabled) {
            StackExchange.using("snippets", function() {
            createEditor();
            });
            }
            else {
            createEditor();
            }
            });

            function createEditor() {
            StackExchange.prepareEditor({
            heartbeatType: 'answer',
            autoActivateHeartbeat: false,
            convertImagesToLinks: true,
            noModals: true,
            showLowRepImageUploadWarning: true,
            reputationToPostImages: 10,
            bindNavPrevention: true,
            postfix: "",
            imageUploader: {
            brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
            contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
            allowUrls: true
            },
            onDemand: true,
            discardSelector: ".discard-answer"
            ,immediatelyShowMarkdownHelp:true
            });


            }
            });














            draft saved

            draft discarded


















            StackExchange.ready(
            function () {
            StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53454403%2fdifferent-result-between-c-set-and-unordered-set%23new-answer', 'question_page');
            }
            );

            Post as a guest















            Required, but never shown

























            1 Answer
            1






            active

            oldest

            votes








            1 Answer
            1






            active

            oldest

            votes









            active

            oldest

            votes






            active

            oldest

            votes









            2














            It happens because some of your insertions modify the same container that you are currently iterating over by a for cycle. Not surprisingly, insertions into setand into unordered_set might end up in different positions in the linear sequence of container elements. In one container the new element ends up in front of the current position and is later iterated over by the cycle. In other container the new element ends up behind the current position and is never seen by the cycle.



            It is generally not a good idea to modify container that you are currently iterating over by a range-based for cycle. It might not produce any undefined behavior in your case (if you are using associative containers with stable iterators), but still... in my opinion range-based for should be reserved for iterating over non-changing containers.



            In your case insertion of a new element into an std::unordered_set may trigger rehashing and invalidate all iterators of that unordered_set. It means that if that unordered_set is currently being iterated over by a range-based for, you end up with undefined behavior.






            share|improve this answer






























              2














              It happens because some of your insertions modify the same container that you are currently iterating over by a for cycle. Not surprisingly, insertions into setand into unordered_set might end up in different positions in the linear sequence of container elements. In one container the new element ends up in front of the current position and is later iterated over by the cycle. In other container the new element ends up behind the current position and is never seen by the cycle.



              It is generally not a good idea to modify container that you are currently iterating over by a range-based for cycle. It might not produce any undefined behavior in your case (if you are using associative containers with stable iterators), but still... in my opinion range-based for should be reserved for iterating over non-changing containers.



              In your case insertion of a new element into an std::unordered_set may trigger rehashing and invalidate all iterators of that unordered_set. It means that if that unordered_set is currently being iterated over by a range-based for, you end up with undefined behavior.






              share|improve this answer




























                2












                2








                2







                It happens because some of your insertions modify the same container that you are currently iterating over by a for cycle. Not surprisingly, insertions into setand into unordered_set might end up in different positions in the linear sequence of container elements. In one container the new element ends up in front of the current position and is later iterated over by the cycle. In other container the new element ends up behind the current position and is never seen by the cycle.



                It is generally not a good idea to modify container that you are currently iterating over by a range-based for cycle. It might not produce any undefined behavior in your case (if you are using associative containers with stable iterators), but still... in my opinion range-based for should be reserved for iterating over non-changing containers.



                In your case insertion of a new element into an std::unordered_set may trigger rehashing and invalidate all iterators of that unordered_set. It means that if that unordered_set is currently being iterated over by a range-based for, you end up with undefined behavior.






                share|improve this answer















                It happens because some of your insertions modify the same container that you are currently iterating over by a for cycle. Not surprisingly, insertions into setand into unordered_set might end up in different positions in the linear sequence of container elements. In one container the new element ends up in front of the current position and is later iterated over by the cycle. In other container the new element ends up behind the current position and is never seen by the cycle.



                It is generally not a good idea to modify container that you are currently iterating over by a range-based for cycle. It might not produce any undefined behavior in your case (if you are using associative containers with stable iterators), but still... in my opinion range-based for should be reserved for iterating over non-changing containers.



                In your case insertion of a new element into an std::unordered_set may trigger rehashing and invalidate all iterators of that unordered_set. It means that if that unordered_set is currently being iterated over by a range-based for, you end up with undefined behavior.







                share|improve this answer














                share|improve this answer



                share|improve this answer








                edited Nov 24 '18 at 1:54

























                answered Nov 24 '18 at 1:40









                AnTAnT

                259k32419660




                259k32419660
































                    draft saved

                    draft discarded




















































                    Thanks for contributing an answer to Stack Overflow!


                    • Please be sure to answer the question. Provide details and share your research!

                    But avoid



                    • Asking for help, clarification, or responding to other answers.

                    • Making statements based on opinion; back them up with references or personal experience.


                    To learn more, see our tips on writing great answers.




                    draft saved


                    draft discarded














                    StackExchange.ready(
                    function () {
                    StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53454403%2fdifferent-result-between-c-set-and-unordered-set%23new-answer', 'question_page');
                    }
                    );

                    Post as a guest















                    Required, but never shown





















































                    Required, but never shown














                    Required, but never shown












                    Required, but never shown







                    Required, but never shown

































                    Required, but never shown














                    Required, but never shown












                    Required, but never shown







                    Required, but never shown







                    Popular posts from this blog

                    Ottavio Pratesi

                    Tricia Helfer

                    15 giugno