Как я могу отсортировать этот vector
, сравнив pair.first
, который является std::string
? (без предоставления функции статического сравнения и не использовать boost).
Сортировка std::vector <std:: pair <std::string, bool >> по строке?
Ответ 1
std::vector<std::pair<std::string, bool> > v;
std::sort(v.begin(), v.end());
std::pair
перегружает operator<
для сортировки сначала элементом first
, затем элементом second
. Таким образом, если вы просто отсортируете vector
, используя порядок сортировки по умолчанию (operator<
), вы получите желаемый порядок.
Ответ 2
Мне действительно нравится ответ Джеймса, но есть еще один вариант, который вы, возможно, захотите рассмотреть, просто включите все в 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 (lg n), в отличие от O (n) для отсортированного вектора.
Если вы действительно должны использовать вектор, тогда отправляйтесь с ответом Джеймса. Однако, если у вас есть вектор пар, есть хороший шанс, что вы действительно хотите std::map
.
Ответ 3
Вы можете использовать произвольный компаратор для упорядочивания только для пар '.first
.
sort(begin, end,
compose2(less<string>(),
select1st<pair<string, bool> >(),
select1st<pair<string, bool> >()));