确定C++11 unordered_set中是否发生碰撞

Determine if collision occurred in C++11 unordered_set

本文关键字:是否 碰撞 set C++11 unordered 确定      更新时间:2023-10-16

我正在使用 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
}

我不确定如何做到这一点。我意识到我需要有一个与我的s.insert(i)相等的std::pair,但是我不太确定如何设置它,以便我可以做到这一点。

任何帮助将不胜感激

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

for(auto &i : myString){
    if(s.insert(i).second) 
        //inserted
    else
       //already exists
}
for(auto& i: myString) {
    if(s.insert(i).second) std::cout << "inserted" << std::endl
    else std::cout << "dupe" << std::endl;
}

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

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

这意味着它不能包含重复项(如果返回 true,则两个元素被视为等效operator==)。

例:

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已包含具有等效键的元素,则不会插入元素。