Я искал, чтобы получить только уникальные элементы из контейнера. Скажем, srcContainer
- это контейнер, из которого я хочу уникальные элементы. Я посмотрел на три варианта:Получение уникальных элементов из контейнера [C++]
Использование зЬй :: уникальный
std::sort(srcContainer.begin(), srcContainer.end()); srcContainer.erase(std::unique(srcContainer.begin(), srcContainer.end()), srcContainer.end());
Использование BOOST :: уникальный
boost::erase(srcContainer, boost::unique<boost::return_found_end>(boost::sort(srcContainer)));
Мой собственный метод
std::set<T> uniqueElems(srcContainer.begin(), srcContainer.end()); srcContainer.clear(); srcContainer.insert(srcContainer.end(), uniqueElems.begin(), uniqueElems.end());
Проблема с 1. и 2. заключается в том, что они меняют порядок, в котором члены произошли в исходном srcContainer. С 3. нет изменений в порядке, и, кроме того, он дает гораздо лучшую производительность по сравнению с 1. и 2 (это потому, что явная сортировка в 3. ??) выше. Истекшее время настенных часов в течение 3 методов выше, и количества элементов в srcContainer приведено ниже:
размера srcContainer (содержит целые числа) = 1e +-
- STD :: уникальный = 1,04779 сек
- BOOST :: уникальный = 1,04774 сек
- Собственный метод = 0,481638 секразмер srcContainer (содержит Int egers) = 1e + 8
- станд :: Уникальные = 151,554 ИКС
- BOOST :: Уникальный = 151,474 ИКС
- Собственный метод = 57,5693 сек
Мой вопрос :
- Есть ли лучший способ найти уникальное использование std :: unique или BOOST :: уникальный или любой другой код и поддерживающий первоначальный заказ в контейнере?
- Любая проблема с использованием метода 3. выше.
Для профилирования производительности srcContainer
был создан следующим образом:
std::vector<int> srcContainer;
int halfWay = numElems/2;
for (size_t k=0; k<numElems; ++k) {
if (k < halfWay)
srcContainer.push_back(k);
else
srcContainer.push_back(k - halfWay);
}
правок:
Согласовано с комментариями, что метод 3. также изменяет порядок элементов. Есть ли лучший способ получить уникальные элементы без изменения порядка?
Благодаря
Каков тип srcContainer? –
В этом случае я использовал вектор для проверки srcContainer. Но я хочу, чтобы код работал на большинстве типов контейнеров, таких как BOOST :: unique. – cppcoder
Мне просто интересно: насколько велики контейнеры? Профилировали ли вы код, где узкие места? Какую платформу вы используете? Судя по крайним длительным срокам исполнения, я думаю, что узкие места создаются при копировании больших контейнеров, поступающих из std :: unique, а не из сортировки. – tmaric