Что не так с моей функцией сравнения? - PullRequest
0 голосов
/ 11 мая 2019

Я пытаюсь отсортировать вектор пары пары и int, как показано ниже.Но не получить ожидаемый результат.В фактическом выводе последний элемент должен предшествовать второму элементу. Может кто-нибудь объяснить, чего мне не хватает?

int main()
{
   using elem_type = std::pair<std::pair<int,int>,int>;
   std::vector<elem_type> vec;

   vec.push_back(std::make_pair(std::make_pair(3, 1), 2));
   vec.push_back(std::make_pair(std::make_pair(6, 5), 4));
   vec.push_back(std::make_pair(std::make_pair(6, 4), 7));
   vec.push_back(std::make_pair(std::make_pair(5, 4), 6));

   auto cmp = [](const elem_type & left, const elem_type & right){
      return  ((left.first.first< right.first.first) 
               && 
              (left.first.second < right.first.second));
    };

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

  //print sorted vector
  for(size_t i = 0; i < vec.size(); ++i){
    std::cout << vec[i].first.first << " " << vec[i].first.second << " " << vec[i].second << "\n";
   }

}

Ожидаемый результат

3 1 2
5 4 6
6 4 7
6 5 4

Фактический результат

3 1 2
6 5 4
6 4 7
5 4 6

1 Ответ

3 голосов
/ 11 мая 2019

Вы не объяснили, как вы хотите отсортировать тройки, поэтому я могу лишь сказать, что ваши ожидания неверны.

Ваша функция сравнения считает, что последние три элемента равны.

Тройной (x0,x1,x2) считается меньше, чем другой тройной (y0,y1,y2), если x0 < y0 и x1 < y1. Например, при сравнении (6,4,7) и (6,5,4) ни одна тройка не считается меньшей, чем другая, поскольку первое число в каждой тройке одинаково (6 < 6 равно false). Точно так же (5,4,6) считается равным (6,4,7), потому что ни один не меньше другого (4 < 4 ложно).

Единственное, что вы можете разумно ожидать, это (5,4,6) < (6,5,4), но ваша функция сравнения также говорит, что оба они равны (6,4,7). Другими словами, функция утверждает, что существуют значения a, b, c, где a = b и b = c, но a < c. Это не имеет смысла, поэтому ваша функция сравнения не работает.

Если вам нужен только лексикографический порядок, вам не нужно делать ничего особенного :

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

std::pair сортирует по первому компоненту первым; если они равны, сравниваются вторые компоненты. Кажется, это именно то поведение, которое вы ожидаете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...