Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Закрытая тема
Ваша тема закрыта, почему это могло произойти? Возможно,
Нет наработок или кода, если нужно готовое решение - создайте тему в разделе Фриланс и оплатите работу.
Название темы включает слова - "Помогите", "Нужна помощь", "Срочно", "Пожалуйста".
Название темы слишком короткое или не отражает сути вашего вопроса.
Тема исчерпала себя, помните, один вопрос - одна тема
Прочитайте правила и заново правильно создайте тему.
 
Опции темы Поиск в этой теме
Старый 31.05.2008, 22:47   #1
xz121
Новичок
Джуниор
 
Регистрация: 31.05.2008
Сообщений: 2
По умолчанию Сортировка в STL

Имеется граф, ребра которого хранятся в векторе, x,y - номера вершин, w- вес ребра. Можно ли с помошью какой-нибудь сортировки из stl посортить вектор сначала по w, потом при равенстве w по x, а при равенстве x, по y?
xz121 вне форума
Старый 01.06.2008, 11:51   #2
still_alive
Great Code Monkey
Форумчанин
 
Аватар для still_alive
 
Регистрация: 09.08.2007
Сообщений: 533
По умолчанию

Можно.
Надо просто задать в кач-ве критерия сортировки свой бинарный предикат.
still_alive вне форума
Старый 01.06.2008, 16:11   #3
filosof_x86
...
Форумчанин
 
Аватар для filosof_x86
 
Регистрация: 01.06.2008
Сообщений: 134
По умолчанию

Конечно можно. Для этого надо перегрузить оператор сравнения:

Код:
#include <iostream>
#include <vector>
#include <algorithm>

class A {
public:
  A(int w, int x, int y)
  {
    w_ = w;
    x_ = x;
    y_ = y;
  }

  friend bool operator<(const A &i, const A &j)
  {
    if(i.w_!=j.w_) return i.w_ < j.w_;
    if(i.x_!=j.x_) return i.x_ < j.x_;
    return i.y_ < j.y_;
  }

  void print()
  {
    std::cout << "[ w = " << w_ << " ; x = " << x_ << " ; y = " << y_ << " ]" << std::endl;
  }

private:
  int w_, x_, y_;
};

int main()
{
  std::vector<A> a;
  a.push_back(A(4, 5, 8));
  a.push_back(A(3, 5, 8));
  a.push_back(A(3, 1, 8));
  a.push_back(A(4, 5, 2));

  std::vector<A>::iterator begin = a.begin(), 
                                    end = a.end(),
                                    it;

  std::cout << "before sort: " << std::endl;
  for(it = begin; it != end; it++) it->print();

  std::sort(begin, end);

  std::cout << "after sort: " << std::endl;
  for(it = begin; it != end; it++) it->print();
  return 0;
}
Вывод программы:
Код:
before sort:
[ w = 4 ; x = 5 ; y = 8 ]
[ w = 3 ; x = 5 ; y = 8 ]
[ w = 3 ; x = 1 ; y = 8 ]
[ w = 4 ; x = 5 ; y = 2 ]
after sort:
[ w = 3 ; x = 1 ; y = 8 ]
[ w = 3 ; x = 5 ; y = 8 ]
[ w = 4 ; x = 5 ; y = 2 ]
[ w = 4 ; x = 5 ; y = 8 ]
filosof_x86 вне форума
Старый 09.06.2008, 19:30   #4
xz121
Новичок
Джуниор
 
Регистрация: 31.05.2008
Сообщений: 2
По умолчанию

Большое спасибо
xz121 вне форума
Закрытая тема


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Сортировка V25 Паскаль, Turbo Pascal, PascalABC.NET 7 07.11.2008 15:30
Сортировка Dissonance БД в Delphi 4 08.06.2008 22:09
1. Сортировка Шелла по убыванию 2. Сортировка вставками по убыванию Arkuz Помощь студентам 1 25.09.2007 17:16
Сортировка omi БД в Delphi 2 23.02.2007 09:41