2011-01-05 2 views

ответ

33
std::vector<std::pair<std::string, bool> > v; 
std::sort(v.begin(), v.end()); 

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

+1

Это ответ на C++ 0x. ;) Изменить: теперь исправлено ('>>' токен, закрывающий два вложенных шаблона '<>' пары только C++ 0x). –

+0

@Charles: Ha! Да, я, вероятно, делаю это в большом количестве ответов. Я слишком привык к использованию компилятора, который поддерживает '>>'. –

+4

+1: Я не знал, что 'std :: pair :: operator <()' был перегружен. Сейчас сделаю! –

0

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

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

Обратите внимание, что 'select1st' не является частью стандартной библиотеки C++. –

+0

Mmm. К счастью, тривиально писать: 'template struct select1st: public unary_function {const typename T :: first_type & operator() (const T & x) const {return x.first;}};' – ephemient

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 (ГПВ н), в отличие от O (N) для отсортированный вектор.

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

+0

Мне нужно рассмотреть случай, когда пользователь не хочет, чтобы они отсортировались и в том порядке, в котором они им были предоставлены. – jmasterx

+1

Также вектор + сортировка на практике может быть намного быстрее, чем вставка большого количества материала в (мульти) карту, независимо от того, что говорит нота большого О. – Reunanen

Смежные вопросы