Подтвердить что ты не робот

Сортировка std::vector <std:: pair <std::string, bool >> по строке?

Как я могу отсортировать этот vector, сравнив pair.first, который является std::string? (без предоставления функции статического сравнения и не использовать boost).

4b9b3361

Ответ 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> >()));