Сортировка std:: vector<std:: pair <std:: string, bool >> по строке?
Как я могу отсортировать это vector
сравнивая pair.first
который является std::string
? (без предоставления статической функции сравнения, ни использования повышения).
5 ответов
std::vector<std::pair<std::string, bool> > v;
std::sort(v.begin(), v.end());
std::pair
перегрузки operator<
отсортировать сначала по first
элемент затем second
элемент. Таким образом, если вы просто сортируете vector
используя сортировку по умолчанию (operator<
), вы получите желаемый заказ.
Мне очень нравится ответ Джеймса, но есть еще один вариант, который вы могли бы рассмотреть - просто направить все в 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
,
Ответ на "двойной вопрос" этого: ссылка: Сортировать вектор пар по первому элементу, а затем по второму элементу пары в 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
Вы можете использовать собственный компаратор для заказа на пары .first
только.
sort(begin, end,
compose2(less<string>(),
select1st<pair<string, bool> >(),
select1st<pair<string, bool> >()));
Вам не нужно предоставлять какую-либо функцию сравнения, поскольку по умолчанию функция sort() сортирует вектор в порядке возрастания значений. Поскольку каждый элемент является парой, одна пара будет меньше другой, если первое значение одной пары меньше, чем значение другой пары.
vector<pair<string,int>>v;
v = {{"xyz",1},{"pq",2}}; // Sample input
sort(v.begin(),v.end()); // Requires #include<algorithm> header