Я играю с С++ 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)
однако я не совсем уверен, как настроить это, чтобы я мог это сделать.
Любая помощь будет принята с благодарностью
Почему вы обеспокоены? std::unordered_set
содержит только уникальные элементы (автоматически не добавляется, если он уже существует), но есть функция find()
:
for(auto &i : myString){
if(s.insert(i).second)
//inserted
else
//already exists
}
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
не будет вставлять элемент, если он уже содержит элемент с эквивалентным ключом.
for(auto& i: myString) {
if(s.insert(i).second) std::cout << "inserted" << std::endl
else std::cout << "dupe" << std::endl;
}
unordered_set
не будет вставлять дубликаты, никаких проверок не требуется.