Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > operator= и sort


Автор: Luyan 24.10.2012, 17:51
Допустим есть структура data с двумя полями a и b. Оператор = перегружен таким образом, чтобы изменялось только поле a.
Проблема следующая: я хочу отсортировать вектор объектов по полю b с помощью std::sort, но оператор = у меня перегружен.
Код

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

struct data
{
    double a;
    double b;

    data():a(0.0), b(0.0) {}

    data(const data &x): a(x.a), b(x.b) {}

    data& operator=(const data& x)
    {
        if(this == &x)
            return *this;
        a = x.a;
        return *this;
    }
    bool operator<(const data& x) const
    {
        return b < x.b;
    }
};
int main()
{
    data obj1, obj2;
    obj1.a = obj1.b = 1.0;
    obj2.a = obj2.b = 2.0;
    obj1 = obj2;
    cout << obj1.a << ' ' << obj1.b << endl;

    vector<data> pop(10);

    for(int i = 0; i < 10; i++)
    {
        pop[i].b = 10-i;
        cout << pop[i].b << ' ';
    }
    cout << '\n' << endl;

    sort(pop.begin(),pop.end());

    for(int i = 0; i < 10; i++)
        cout << pop[i].b << ' ';
    cout << endl;
}

получаю
Код

2 1
10 9 8 7 6 5 4 3 2 1 
10 9 8 7 6 5 4 3 2 1

а хотелось бы вот так:
Код

2 1
10 9 8 7 6 5 4 3 2 1 
1 2 3 4 5 6 7 8 9 10

Как это сделать с таким образом реализованным оператором=?

/////

Как я понимаю std::sort использует swap и мне эту фунцкию надо перегрузить для объектов моего типа. Вот как это сделать?

Автор: Result 24.10.2012, 21:00
Похоже что нет 100% гарантии что std::sort использует swap smile 

http://liveworkspace.org/code/d3083717bb6b11417c1fd67f078f2033

Автор: xvr 25.10.2012, 13:37
Цитата(Luyan @  24.10.2012,  17:51 Найти цитируемый пост)
Как это сделать с таким образом реализованным оператором=?

Никак. Ваш оператор = не отвечает семантике копирования. У вас после присваивания получается помесь состояния оригинального и копируемого объекта. Алгоритмы из stl с такими объектами работать не обязанны.

Автор: Luyan 25.10.2012, 15:50
ясно, пришлось перегружать для создания "помеси" другой оператор.

Автор: NoviceF 28.10.2012, 10:21
Цитата(Luyan @ 25.10.2012,  16:50)
ясно, пришлось перегружать для создания "помеси" другой оператор.

В одной книжечке под авторством "Саттер, Александреску" видел рекомендацию в похожих случаях добавлять отдельную именованную функцию, вместо перегрузки какого-либо оператора.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)