【问题标题】:Determine if collision occurred in C++11 unordered_set确定 C++11 unordered_set 中是否发生冲突
【发布时间】:2014-02-21 21:17:00
【问题描述】:

我正在使用 C++11,我正在尝试将元素添加到无序集合中,如果我已经向我的 unordered_set 添加了一个元素,我不想再次添加它(即)不要添加 cat再次到下面的无序集。

    std::unordered_set<std::string> s;
    std::vector<std::string> myString;

    myString.push_back("cat");
    myString.push_back("dog");
    myString.push_back("bird");
    myString.push_back("cat");



for(auto &i : myString){
        //add elements from myString to unordered_set s
}

我不确定该怎么做。我意识到我需要有一个 std::pair 等于我的 s.insert(i) 但是我不太确定如何设置它所以我可以这样做。

任何帮助将不胜感激

【问题讨论】:

    标签: c++ c++11


    【解决方案1】:

    你为什么担心? std::unordered_set 只包含唯一元素(如果已经存在则自动不添加),但有一个find() 功能:

    for(auto &i : myString){
        if(s.insert(i).second) 
            //inserted
        else
           //already exists
    }
    

    【讨论】:

    【解决方案2】:
    for(auto& i: myString) {
        if(s.insert(i).second) std::cout << "inserted" << std::endl
        else std::cout << "dupe" << std::endl;
    }
    

    unordered_set 不会插入重复项,不需要检查。

    【讨论】:

      【解决方案3】:

      std::unordered_set 包含一组唯一对象。

      这意味着它可以包含重复项(如果 operator== 返回 true,则认为两个元素是等效的)。

      示例:

      std::unordered_set<std::string> s;
      s.emplace("cat");
      s.emplace("cat");
      s.emplace("cat");
      
      // At this point s only contains one std::string object.
      

      要从std::vector 添加独特的项目,只需像这样使用std::vector::insert

      s.insert(std::begin(vec), std::end(vec));
      

      如果std::unordered_set 已经包含具有等效键的元素,则不会插入该元素。

      【讨论】:

        猜你喜欢
        • 2010-09-16
        • 2020-06-12
        • 2020-06-10
        • 1970-01-01
        • 1970-01-01
        • 2010-09-30
        • 1970-01-01
        • 2011-03-21
        相关资源
        最近更新 更多