Модераторы: bsa

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Сортировка элементов вектора 
V
    Опции темы
m9yt
Дата 28.4.2010, 16:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 173
Регистрация: 27.2.2010

Репутация: нет
Всего: нет



Доброго времени суток!

В общем, имеется вектор, содержащий указатели на объекты различных классов.
В программе я создаю эти объекты и помещаю в коллекцию. После этого мне необходимо их отсортировать функцией set().
Вот:

Код

.............
#include<algorithm>
......................

sort(collection->begin(), collection->end());



После просмотра коллекции ничего не происходит.Все объекты выводятся в том же порядке.
В чем ошибка?Может вектор должен сортироваться не по указателям на объекты, а по самим объктам?
PM MAIL   Вверх
Sartorius
Дата 28.4.2010, 16:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1568
Регистрация: 18.7.2006
Где: Ivory tower

Репутация: 2
Всего: 37



удалил

Это сообщение отредактировал(а) Sartorius - 28.4.2010, 16:47
PM MAIL ICQ   Вверх
lexa107
Дата 28.4.2010, 16:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 38
Регистрация: 25.4.2010
Где: Минск

Репутация: нет
Всего: нет



Когда сортируешь свои объекты таким образом, надо ещё добавлять функциональный класс, в котором описываешь как сравниваются два объекта
PM MAIL ICQ   Вверх
m9yt
Дата 28.4.2010, 16:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 173
Регистрация: 27.2.2010

Репутация: нет
Всего: нет



Можно небольшой примерчик функционального класса?
В моих классах имеется:
в 1-м поле string и int
во 2-м 2 поля string и int

Кстати, у нас в лабе ничего о  функциональном классе не сказано.
Написано только, что при создании своей функции сортировки необходимо использовать функцию сравнения.

Это сообщение отредактировал(а) m9yt - 28.4.2010, 16:56
PM MAIL   Вверх
azesmcar
Дата 28.4.2010, 16:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 52
Всего: 211



Код

#include <vector>
#include <algorithm>
#include <functional>
#include <iostream>

struct compare : std::binary_function<int, int, bool>
{
    bool operator()(int* a, int* b)
    {
        return *a < *b;
    }
};

int main()
{
    std::vector<int*> v;
    v.push_back(new int(10));
    v.push_back(new int(5));
    v.push_back(new int(7));
    v.push_back(new int(98));

    std::sort(v.begin(), v.end(), compare());

    for (std::vector<int*>::const_iterator it = v.begin(); it != v.end(); ++it)
    {
        std::cout << **it << std::endl;
        delete *it;
    }
}

пример

Это сообщение отредактировал(а) azesmcar - 28.4.2010, 16:56
PM   Вверх
lexa107
Дата 28.4.2010, 17:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 38
Регистрация: 25.4.2010
Где: Минск

Репутация: нет
Всего: нет



Честно сказать, я не пробовал сравнивать разные классы, но вообще функциональный класс сравнения выглядит так:
Код

class compare
{
public:
    bool operator()(MyClass obj1, MyClass obj2)
    {
        return obj1.str < obj2.str;
    }
};


где MyClass - это класс, объекты которого сравниваются, 
      str - строка в этом классе

Теперь надо sort делать следующим образом:
Код

sort(vect.begin(), vect.end(), compare());


обогнали(

Это сообщение отредактировал(а) lexa107 - 28.4.2010, 17:01
PM MAIL ICQ   Вверх
m9yt
Дата 28.4.2010, 17:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 173
Регистрация: 27.2.2010

Репутация: нет
Всего: нет



Цитата(azesmcar @ 28.4.2010,  16:55)
Код

#include <vector>
#include <algorithm>
#include <functional>
#include <iostream>

struct compare : std::binary_function<int, int, bool>
{
    bool operator()(int* a, int* b)
    {
        return *a < *b;
    }
};

int main()
{
    std::vector<int*> v;
    v.push_back(new int(10));
    v.push_back(new int(5));
    v.push_back(new int(7));
    v.push_back(new int(98));

    std::sort(v.begin(), v.end(), compare());

    for (std::vector<int*>::const_iterator it = v.begin(); it != v.end(); ++it)
    {
        std::cout << **it << std::endl;
        delete *it;
    }
}

пример

Н-дааа.пример конечно не очень наглядный.в его работе сложно разобраться. можно хотя бы эти std:: заменить?

Добавлено через 1 минуту и 5 секунд
Цитата(lexa107 @ 28.4.2010,  17:00)
Честно сказать, я не пробовал сравнивать разные классы, но вообще функциональный класс сравнения выглядит так:
Код

class compare
{
public:
    bool operator()(MyClass obj1, MyClass obj2)
    {
        return obj1.str < obj2.str;
    }
};


где MyClass - это класс, объекты которого сравниваются, 
      str - строка в этом классе

Теперь надо sort делать следующим образом:
Код

sort(vect.begin(), vect.end(), compare());


обогнали(

Твой пример мне намного понятней)))
PM MAIL   Вверх
lexa107
Дата 28.4.2010, 17:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 38
Регистрация: 25.4.2010
Где: Минск

Репутация: нет
Всего: нет



пропиши в начале 
using namespace std;

и не надо будет std:: писать
PM MAIL ICQ   Вверх
m9yt
Дата 28.4.2010, 17:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 173
Регистрация: 27.2.2010

Репутация: нет
Всего: нет



Тогда еще вопрос.
Ведь у меня в классе не 1 поле.Если, например, в одном классе строка в первом поле больше, но в другом больше во втором поле, то как быть?
И как сравнивать классы с вообще разным количеством полей?

Это сообщение отредактировал(а) m9yt - 28.4.2010, 17:11
PM MAIL   Вверх
lexa107
Дата 28.4.2010, 17:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 38
Регистрация: 25.4.2010
Где: Минск

Репутация: нет
Всего: нет



Не обязательно писать 

return a < b;

можно проделать сначала любые другие действия:
например, если надо сравнить по именам и фамилиям, но они записаны в разных строках, можно сложить их в одну, и уже тогда сравнивать. Простор тут не ограничен

Добавлено через 2 минуты и 29 секунд
Чтобы сравнить два разных класса, можно попробовать перегрузить оператор скобок на разные входные данные. Пример нужен?
PM MAIL ICQ   Вверх
m9yt
Дата 28.4.2010, 17:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 173
Регистрация: 27.2.2010

Репутация: нет
Всего: нет



Цитата(lexa107 @ 28.4.2010,  17:15)
Не обязательно писать 

return a < b;

можно проделать сначала любые другие действия:
например, если надо сравнить по именам и фамилиям, но они записаны в разных строках, можно сложить их в одну, и уже тогда сравнивать. Простор тут не ограничен

Добавлено @ 17:17
Чтобы сравнить два разных класса, можно попробовать перегрузить оператор скобок на разные входные данные. Пример нужен?

Не помешает.
PM MAIL   Вверх
lexa107
Дата 28.4.2010, 17:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 38
Регистрация: 25.4.2010
Где: Минск

Репутация: нет
Всего: нет



Я, конечно, так никогда не делал, но по идее должно работать

Код

class compare
{
public:
    bool operator()(MyClass1 obj1, MyClass1 obj2) //сравниваются два одинаковых класса MyClass1
    {
        return obj1.str < obj2.str;
    }
    bool operator()(MyClass2 obj1, MyClass2 obj2) //сравниваются два одинаковых класса MyClass2
    {
        return obj1.str < obj2.str;
    }
    bool operator()(MyClass2 obj1, MyClass1 obj2) //сравниваются два разных класса класса. MyClass2 идёт первым
    {
        return obj1.str < obj2.str;
    }
    bool operator()(MyClass1 obj1, MyClass2 obj2) //сравниваются два разных класса класса. MyClass1 идёт первым
    {
        return obj1.str < obj2.str;
    }
};


Возращаемое значение конечно же нужно отредактировать под свои классы
PM MAIL ICQ   Вверх
m9yt
Дата 28.4.2010, 17:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 173
Регистрация: 27.2.2010

Репутация: нет
Всего: нет



А по какому полю сравнивать, зависит от меня?
Нельзя как-то сравнивать сразу по всем полям?
PM MAIL   Вверх
lexa107
Дата 28.4.2010, 17:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 38
Регистрация: 25.4.2010
Где: Минск

Репутация: нет
Всего: нет



Цитата

А по какому полю сравнивать, зависит от меня?


Да, ты это сам можешь выбрать

Цитата

Нельзя как-то сравнивать сразу по всем полям?


Если ты сможешь при этом выбрать, какой объект больше, то можешь попробовать
PM MAIL ICQ   Вверх
m9yt
Дата 28.4.2010, 17:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 173
Регистрация: 27.2.2010

Репутация: нет
Всего: нет



Код

class compare{
public:
    bool operator()(ID* obj1, ID* obj2)
    {
        address *w1, *w2;
        w1=(address*)(obj1);
        w2=(address*)(obj2);
        return w1->id<w2->id;
    }
    bool operator()(ID* obj1, ID* obj2)
    {
        Email *w1, *w2;
        w1=(Email*)(obj1);
        w2=(Email*)(obj2);
        return w1->id<w2->id;
    }
    bool operator()(ID* obj1, ID* obj2)
    {
        address *w1;
        Email *w2;
        w1=(address*)(obj1);
        w2=(Email*)(obj2);
        return w1->id<w2->id;
    }


соответствнно, выдает ошибку error C2535: bool compare::operator ()(ID *,ID *): функция-член уже определена или объявлена    

ID*-указатель на абстрактный класс

Это сообщение отредактировал(а) m9yt - 28.4.2010, 17:38
PM MAIL   Вверх
lexa107
Дата 28.4.2010, 17:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 38
Регистрация: 25.4.2010
Где: Минск

Репутация: нет
Всего: нет



Так это потому что ты при перегрузке функций передаёшь одни и те же параметры. Подожди, я сейчас попробую поправить твой код
PM MAIL ICQ   Вверх
m9yt
Дата 28.4.2010, 17:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 173
Регистрация: 27.2.2010

Репутация: нет
Всего: нет



Надо как-то сделать, чтобы различные параметры передавались...
PM MAIL   Вверх
lexa107
Дата 28.4.2010, 17:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 38
Регистрация: 25.4.2010
Где: Минск

Репутация: нет
Всего: нет



У тебя address и Email - это наследники одного класса ID. Так?
Где ты задаёшь поле id?
PM MAIL ICQ   Вверх
m9yt
Дата 28.4.2010, 17:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 173
Регистрация: 27.2.2010

Репутация: нет
Всего: нет



Цитата(lexa107 @ 28.4.2010,  17:37)
Так это потому что ты при перегрузке функций передаёшь одни и те же параметры. Подожди, я сейчас попробую поправить твой код

Опередил)

Добавлено через 5 минут и 50 секунд
Цитата(lexa107 @ 28.4.2010,  17:41)
У тебя address и Email - это наследники одного класса ID. Так?
Где ты задаёшь поле id?

address наследник ID, а Email наследник address.
поле id задаю 

Код

class ID{
public:
    int id;
public:
    ID(){id=0;}
    ID(int _id){id=_id;}
    virtual void show()=0;
    virtual void Input()=0;
};


Код

address::address(int _id, string _adrs):ID(_id)
{
    adrs=_adrs;
}



Код

void address::Input()
{
    char s[10];
    cout<<"Идентификатор:";cin.getline(s,10);
    id=atoi(s);
    cout<<"Адрес:";getline(cin, adrs, '\n');
}



Код

void Programm::CreateAddress()
{
    ID* p;
    cout<<"<Создание объекта Адрес...>"<<endl;
    p=new address;
    p->Input();
    collection->push_back(p);
}

PM MAIL   Вверх
lexa107
Дата 28.4.2010, 17:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 38
Регистрация: 25.4.2010
Где: Минск

Репутация: нет
Всего: нет



Попробуй просто написать:

Код

class compare{
public:
    bool operator()(ID* obj1, ID* obj2)
    {    
        return obj1->id<obj2->id;
    }
};


Это сообщение отредактировал(а) lexa107 - 28.4.2010, 17:53
PM MAIL ICQ   Вверх
m9yt
Дата 28.4.2010, 17:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 173
Регистрация: 27.2.2010

Репутация: нет
Всего: нет



может так?
Код

class compare{
public:
    bool operator()(address* obj1, address* obj2)
    {
    
        return obj1->id<obj2->id;
    }
    bool operator()(Email * obj1, Email * obj2)
    {
      
        return obj1->id<obj2->id;
    }
}


PM MAIL   Вверх
lexa107
Дата 28.4.2010, 17:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 38
Регистрация: 25.4.2010
Где: Минск

Репутация: нет
Всего: нет



Цитата(m9yt @ 28.4.2010,  17:52)
может так?
Код

class compare{
public:
    bool operator()(address* obj1, address* obj2)
    {
    
        return obj1->id<obj2->id;
    }
    bool operator()(Email * obj1, Email * obj2)
    {
      
        return obj1->id<obj2->id;
    }
}


Может и так прокатит
PM MAIL ICQ   Вверх
m9yt
Дата 28.4.2010, 18:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 173
Регистрация: 27.2.2010

Репутация: нет
Всего: нет



Цитата(lexa107 @ 28.4.2010,  17:54)
Цитата(m9yt @ 28.4.2010,  17:52)
может так?
Код

class compare{
public:
    bool operator()(address* obj1, address* obj2)
    {
    
        return obj1->id<obj2->id;
    }
    bool operator()(Email * obj1, Email * obj2)
    {
      
        return obj1->id<obj2->id;
    }
}


Может и так прокатит

Не катит...((
error C2664: bool compare::operator ()(address *,address *): невозможно преобразовать параметр 1 из 'ID *' в 'address *'
PM MAIL   Вверх
lexa107
Дата 28.4.2010, 18:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 38
Регистрация: 25.4.2010
Где: Минск

Репутация: нет
Всего: нет



Мой способ тоже никак?

Это сообщение отредактировал(а) lexa107 - 28.4.2010, 18:07
PM MAIL ICQ   Вверх
m9yt
Дата 28.4.2010, 18:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 173
Регистрация: 27.2.2010

Репутация: нет
Всего: нет



Цитата(lexa107 @ 28.4.2010,  17:49)
Попробуй просто написать:

Код

class compare{
public:
    bool operator()(ID* obj1, ID* obj2)
    {    
        return obj1->id<obj2->id;
    }
};

Вот это прокатило!)))

Сейчас объект сортируются по id в порядке возрастания, независимо от типа класса!
Думаю, мы добились нужного?
PM MAIL   Вверх
lexa107
Дата 28.4.2010, 18:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 38
Регистрация: 25.4.2010
Где: Минск

Репутация: нет
Всего: нет



Тебе видней, добились или нет smile 
PM MAIL ICQ   Вверх
m9yt
Дата 28.4.2010, 18:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 173
Регистрация: 27.2.2010

Репутация: нет
Всего: нет



Цитата(lexa107 @ 28.4.2010,  18:15)
Тебе видней, добились или нет smile

Спасибо тебе.
У меня впереди сортировка слиянием.Если что, напишу в личку)
PM MAIL   Вверх
lexa107
Дата 28.4.2010, 18:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 38
Регистрация: 25.4.2010
Где: Минск

Репутация: нет
Всего: нет



удалил

Это сообщение отредактировал(а) lexa107 - 28.4.2010, 18:28
PM MAIL ICQ   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0910 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.