Сортировка std :: vector> по строке? - PullRequest
14 голосов
/ 06 января 2011

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

Ответы [ 4 ]

37 голосов
/ 06 января 2011
std::vector<std::pair<std::string, bool> > v;
std::sort(v.begin(), v.end());

std::pair перегружает operator< для сортировки сначала по элементу first, а затем по элементу second. Таким образом, если вы просто отсортируете vector, используя порядок сортировки по умолчанию (operator<), вы получите желаемый порядок.

3 голосов
/ 06 января 2011

Мне очень нравится ответ Джеймса, но есть еще один вариант, который вы могли бы рассмотреть - просто объединить все в std::map:

std::map<std::string, bool> myMap(v.begin(), v.end());

Или, если у вас есть повторяющиеся строки, a std::multimap:

std::multimap<std::string, bool> myMultiMap(v.begin(), v.end());

Это имеет дополнительное преимущество: если вам необходимо добавить или удалить новые пары ключ / значение, вы можете сделать это в O (lg n), а не в O (n) для отсортированного вектора.

Если вы действительно должны использовать вектор, тогда ответьте Джеймсу. Однако, если у вас есть вектор пар, есть большая вероятность, что вы действительно хотите std::map.

0 голосов
/ 15 ноября 2018

Ответ на «повторяющийся вопрос»: ссылка: Сортировать вектор пар по первому элементу, а затем по второму элементу пары в C ++?

bool cmp(const pair<int,int>&x,const pair<int,int>y){
if(x.first==y.first){
   return(x.second<y.second);
}
return(x.first<y.first);
}

array of pairs before:
5 2
4 2
8 2
8 3
8 1
array of pairs after:
4 2
5 2
8 1
8 2
8 3
0 голосов
/ 06 января 2011

Вы можете использовать собственный компаратор для заказа только по парам .first.

sort(begin, end,
     compose2(less<string>(),
              select1st<pair<string, bool> >(),
              select1st<pair<string, bool> >()));
...