Как я могу сортировать это vector
путем сравнения pair.first
который является std::string
? (без предоставления функции статического сравнения и не использовать boost).Сортировка строки std :: vector <std :: pair <std :: string, bool >> по строке?
ответ
std::vector<std::pair<std::string, bool> > v;
std::sort(v.begin(), v.end());
std::pair
перегрузки operator<
для сортировки сначала по first
элементу, то с помощью second
элемента. Таким образом, если вы просто отсортируете vector
, используя порядок сортировки по умолчанию (operator<
), вы получите желаемый заказ.
Вы можете использовать произвольный компаратор для заказа только по парам «.first
».
sort(begin, end,
compose2(less<string>(),
select1st<pair<string, bool> >(),
select1st<pair<string, bool> >()));
Обратите внимание, что 'select1st' не является частью стандартной библиотеки C++. –
Mmm. К счастью, тривиально писать: 'template
Мне очень нравится ответ Джеймса, но есть еще один вариант, вы можете рассмотреть - просто воронку все в std::map
:
std::map<std::string, bool> myMap(v.begin(), v.end());
Или, если у вас есть повторяющиеся строки, std::multimap
:
std::multimap<std::string, bool> myMultiMap(v.begin(), v.end());
Это имеет дополнительное преимущество, что если после этого нужно добавить или удалить новые пары ключ/значение, вы можете сделать это в O (ГПВ н), в отличие от O (N) для отсортированный вектор.
Если вы действительно должны использовать вектор, то отправляйтесь с ответом Джеймса. Однако, если у вас есть вектор пар, есть хороший шанс, что вы действительно хотите std::map
.
Мне нужно рассмотреть случай, когда пользователь не хочет, чтобы они отсортировались и в том порядке, в котором они им были предоставлены. – jmasterx
Также вектор + сортировка на практике может быть намного быстрее, чем вставка большого количества материала в (мульти) карту, независимо от того, что говорит нота большого О. – Reunanen
- 1. std :: vector <std::string> crash
- 2. Перемещение элементов из std :: vector <T1> в std :: vector <std :: pair <T1,T2>>
- 3. Convert std :: vector <bool> to std :: string
- 4. std :: sort on std :: vector <std::string>
- 5. C++ loop std :: vector <std :: map <std :: string, std :: string>>
- 6. std :: vector <std :: vector <T>> vs std :: vector <T*>
- 7. Как преобразовать void * в std :: vector <std :: vector <std::string>> *?
- 8. iterate std :: vector <std :: vector <char>>?
- 9. std :: set <std :: pair <size_t, std :: string>> :: find(), без построения строковой копии
- 10. найти в std :: vector <std::pair>
- 11. Как перебирать boost: вариант <std :: vector <int>, std :: vector <String>>?
- 12. Построить std :: map <T,U> от std :: vector <std :: pair <T,U>>
- 13. Инициализация std :: pair <double, std :: array <std :: pair <double, double>, 3>>
- 14. std :: vector <bool> оптимизация реализации
- 15. Почему std :: vector <bool> быстрее?
- 16. Как построить std :: string из std :: vector <string>?
- 17. Может get_line напрямую заполнить std :: vector <std::string>?
- 18. Распечатайте std :: vector <std :: wstring>
- 19. Преобразование между std :: bitset и std :: vector <bool>
- 20. std :: vector <string> странное поведение
- 21. error: невозможно преобразовать std :: vector <std :: basic_string <char>> to std :: string *
- 22. Как написать хэш-функцию для std :: vector <std :: vector <bool>>
- 23. gsl :: array_view <const gsl :: cstring_view <>> from std :: vector <std::string>
- 24. std :: vector <std::string> Вставить пустую строку вместо
- 25. Как передать std :: vector <std::string> as char **?
- 26. Почему "std :: vector <std::string> &" вместо "void"?
- 27. Эффективный разбор данных std :: stringstream в std :: vector <std :: vector <double>>
- 28. Исчезающее содержимое std :: vector <std::string>
- 29. Возврат std :: vector <std::string>, но иногда только
- 30. C++ std :: vector <std::string> iterator segfaults
Это ответ на C++ 0x. ;) Изменить: теперь исправлено ('>>' токен, закрывающий два вложенных шаблона '<>' пары только C++ 0x). –
@Charles: Ha! Да, я, вероятно, делаю это в большом количестве ответов. Я слишком привык к использованию компилятора, который поддерживает '>>'. –
+1: Я не знал, что 'std :: pair :: operator <()' был перегружен. Сейчас сделаю! –