Я новичок в C++, и меня попросили преобразовать программу Java в C++. Я пытаюсь написать метод для проверки того, что все элементы в unordered_set существуют в другом unordered_set. Я нашел приведенный ниже пример с использованием hash_set, но hash_set устарел, и сейчас рекомендуется использовать unordered_set.
// returns true if one contains all elements in two
bool SpecSet::containsAll(hash_set<Species*> one, hash_set<Species*> two) {
sort(one.begin(), one.end());
sort(two.begin(), two.end());
return includes(one.begin(), one.end(), two.begin(), two.end());
}
Поэтому мне нужен способ сделать это с помощью unordered_set. Сортировка не работает с неупорядоченными наборами, а скорость поиска важна, поэтому я не хочу использовать упорядоченный набор.
bool SpecSet::containsAll(unordered_set<Species*> one, unordered_set<Species*> two) {
return ?;
}
Я был бы очень признателен за помощь в подходе к эффективному выполнению этого.
РЕДАКТИРОВАТЬ: я думаю, это сработает. Кажется, нет более эффективного способа, чем перебрать все пополам.
bool SpecSet::containsAll(unordered_set<Species*> one, unordered_set<Species*> two) {
if(two.size() > one.size())
{
return false;
}
for(Species *species : two)
{
if(one.find(species) == one.end())
{
return false;
}
}
return true;
}
O(n log n)
, в то время как ручной поиск кажется бытьO(n)
. Просто потому, что что-то делается с помощью меньшего количества кода, не обязательно означает, что это быстрее. - person Sam Varshavchik   schedule 17.01.2018auto
для вывода типа выражения присваивания, что особенно интересно при выполнении цикла:for (auto& specie : species ){...})
и облегчить чтение вашего кода. - person Felix Bertoni   schedule 26.11.2019