2013-12-24 38 views
-3

Я побежал интро проблемы при попытке отсортировать вектор типа:Сортировка вектор пар

vector<pair<string, pair<string, int>>>

Я хочу, чтобы быть отсортирован после первой строки первой пары.

sort(all_pairs.begin(), all_pairs.end(), comp);

где all_pairs это мой вектор, и комп

bool comp(const pair<string, pair<string, int>> &a, const pair<string, pair<string, int>> &b) 
{ 
    string term1 = a.first; 
    string term2 = b.first; 

    return term1<term2; 
} 

Так что, если мой исходный вектор:

(Z, (а, 1))
(Y , (a, 2))
(X, (a, 3))

Я хочу, чтобы мой результат был:

(X, (а, 3))
(Y, (а, 2))
(Z, (а, 1))

Cold вы мне помочь? Спасибо.
[EDIT]: Как я уже сказал, код является частью более крупной программы, поэтому в этом случае должна быть проблема с моим кодом. Я обновлю это, пока я сделаю прогресс. Благодарю.

+4

Какой вопрос? –

+1

Делает то, что вы не работали? Обратите внимание, что нет необходимости делать все эти копии. – juanchopanza

+1

Я протестировал его. Код действительно работает. –

ответ

1

Ваш код действительно work, поэтому я не уверен, в чем проблема.

vector<pair<string, pair<string, int>>> v = 
{ 
    std::make_pair("Z", std::make_pair("a", 1)), 
    std::make_pair("Y", std::make_pair("a", 2)), 
    std::make_pair("X", std::make_pair("a", 3)), 
}; 

std::sort(v.begin(), v.end(), comp); 
for (const auto& p : v) 
{ 
    std::cout << "(" << p.first << "," 
       << "(" << p.second.first << "," 
       << p.second.second << "))\n"; 
} 

Выход:

(X,(a,3)) 
(Y,(a,2)) 
(Z,(a,1)) 

Вы можете улучшить свою функцию компаратора немного, удаляя ненужные локальные переменные:

return a.first < b.first; 
+0

Не так много смысла в ответе. Уже в комментариях сказано, что код «работает». – juanchopanza

0

Использование оператора < из std::pair или std::tie

typedef std::pair<std::string, std::pair<std::string, int> > P; 

struct X{ 

    bool operator () (const P& lhs, const P& rhs) 
    { 
    // return std::tie(lhs.first, lhs.second.first, lhs.second.second) 
    //  < std::tie(rhs.first, rhs.second.first, rhs.second.second) ; 
    return lhs < rhs ; 
    } 
}; 

std::sort(vec.begin() , vec.end() , X()); 

Demo here

Я не волнует, если ваш код работает: P Я сделал некоторые «усилия»

+1

Не следует ли 'std :: pair' делать это с помощью' operator <'? – chris

+0

@chris действительно да, и я еще один дурак: D – P0W

+0

Они только хотят сортировать на основе первой строки. – juanchopanza

1

Кстати, расширить на копии комментариев выше здесь две версии с незначительными улучшениями. Дешевле:

bool comp(const pair<string, pair<string, int>> &a, const pair<string, pair<string, int>> &b) 
{ 
    const string& term1 = a.first; // saves copying these strngs for no reason 
    const string& term2 = b.first; 

    return term1<term2; 
} 

Более короткие и дешевле:

bool comp(const pair<string, pair<string, int>> &a, const pair<string, pair<string, int>> &b) 
{ 
    return a.first<b.first; 
} 
Смежные вопросы