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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Работа с контейнером, std::set 
:(
    Опции темы
conio
Дата 22.8.2007, 12:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Уважаемые, подсобите! Начал разбираться с контейнерами, прочитал книженцию Страуструпа.
Придумал примерчик, по нему контейнер должен заполниться уникальными записями структуры, после чего нужно найти в этом контейнере одну из записей(и  вытащить из нее последее значение)!
Скомпилилось все без ошибок! Но ни одна из записей не находиться! Что не так сделал? Только сильно не ругайте подозреваю что ляпы присутствуют))!

//--------------------------------------хэдер
Код

#include <set>
using namespace std;

struct TMyStruct{
    int first;
    int second;
    int res;  //искомый элемент!

    TMyStruct(){first=second=res=0;}
    ~TMyStruct(){}

 TMyStruct& operator=(const TMyStruct& a){first=a.first; second=a.second; res=a.res; return (*this);}
 friend bool operator ==(const TMyStruct& a,const  TMyStruct& b){return a.first==b.first&&a.second==b.second;}
 friend bool operator < (const TMyStruct& a,const TMyStruct& b) {
              if(a.first<b.first) return (true);
              else if (a.first==b.first&&a.second<b.second) return (true);
              else if (a.first==b.first&&a.second<b.second&&a.res!=b.res) return (true);
              return (false);};
};
typedef set<TMyStruct,less<TMyStruct>,allocator<TMyStruct> > ContMy;

//----------------------------------сpp

Код

int find(TMyStruct &,ContMy &);
void fill(int ,int ,int ,TMyStruct &);

int main(void)
{
TMyStruct mystruct;
ContMy cont;
int p=0;

fill(12,23,45,mystruct);
cont.insert(mystruct);
fill(12,67,45,mystruct);
cont.insert(mystruct);
fill(13,23,67,mystruct);
cont.insert(mystruct);
fill(15,73,45,mystruct);
cont.insert(mystruct);
fill(13,23,67,mystruct);// ищу совпадение в контейнере по этой записи!
p=find(mystruct,cont);  //ничего не находит.....
}

void fill(int ifirst,int isecond,int iret,TMyStruct &mystruct)
{    mystruct.first = ifirst;
      mystruct.second  = isecond;
      mystruct.ret  = iret;
}

int find(TMyStruct &mystruct,ContMy &cont)
{  ContMy::iterator iter;
    int iRet=0;
    for (iter = cont.begin(); iter!=cont.end(); iter++){
      //if ((*iter).first== phone.first && (*iter).second== second.second)
        if ((*iter).first== mystruct.first && (*iter).second== mystruct.second)//отредактировал
       iRet = (*iter).res;
    };
return(iRet);
}


Это сообщение отредактировал(а) conio - 22.8.2007, 14:11
PM MAIL   Вверх
Earnest
Дата 22.8.2007, 14:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

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



1) Совершенно непонятно, зачем тебе set, если потом ищешь линейным поиском.

2)  Зачем нарисовал оператор ==, если не пользуешься им?

3) Ищешь вроде mystruct, а сравниваешь с каким-то phone:
   if ((*iter).first== phone.first && (*iter).second== second.second)

4) Какой-то мутный у тебя оператор <: нет уверенности, что он строгий. А если это не так, то некоторые новые значения могут в set не попасть... или попасть совсем не туда, куда надо (а потом не найдутся - если set::find использовать).
Оператор < должен однозначно упорядочивать значения.
Кроме того, нехорошо, когда a == b и !(a < b) && !(b < a) дают неодинаковый результат. Второе выражаение - это эквивалентность элементов, как ее понимает set. 
Если очень нужна операция "равно", которая не совпадает с эквивалентностью по оператору <, дай ей другое имя!

5) Раз уж пишешь на С++, то делай нормальные объекты:
Mystruct не помешал бы конструктор (вместо дебильной функции fill), операторы < и == определи на структуре, а не глобальными делай


--------------------
...
PM   Вверх
conio
Дата 22.8.2007, 14:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Большое спасибо за такой конструктивный ответ! Буду исправляться!
А какой STL контейнер наиболее подходит для линейного поиска?
PM MAIL   Вверх
Xenon
Дата 22.8.2007, 14:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Ты Страуструпа читал ли не между строк? Ужас ... Где инкапсуляция? smile Ну ладно, фиг с ним, раз POD структура ... 
Код

#include <set>
using namespace std;

struct TMyStruct
{
    int first;
    int second;
    int res;  //искомый элемент!
    TMyStruct& operator=(const TMyStruct& a)
    {
        first = a.first; 
        second = a.second; 
        res = a.res; 
        return (*this);
    }
    TMyStruct(int a_first = 0, int a_second = 0, int a_res = 0):first(a_first), second(a_second), res(a_res) {}
};

bool operator ==(const TMyStruct& a,const  TMyStruct& b)
{
    return a.first == b.first && a.second == b.second;
}

bool operator < (const TMyStruct& a, const TMyStruct& b) 
{
    if(a.first < b.first) return true;
    else if (a.first == b.first && a.second < b.second) return true;
    else if (a.first == b.first && a.second < b.second && a.res != b.res) return true;
    return false;
}

typedef set<TMyStruct> ContMy; //Зачем указывать то, что по-умолчанию задается

int main(int argc, char argv[]) 
{
    TMyStruct mystruct(15,73,45);
    ContMy cont;
    //fill(12,23,45,mystruct); //Зачем использовать какую-то мощную функцию, если можно воспользоваться конструктором?
    cont.insert( TMyStruct(12,23,45) );
    //fill(12,67,45,mystruct);
    cont.insert( TMyStruct(12,67,45) );
    //fill(13,23,67,mystruct);
    cont.insert( TMyStruct(13,23,67) );
    //fill(15,73,45,mystruct);
    cont.insert( TMyStruct(15,73,45) );
    //fill(13,23,67,mystruct);// ищу совпадение в контейнере по этой записи!
    //p = find(mystruct,cont);  //ничего не находит.....
    ContMy::iterator iter = std::find( cont.begin(), cont.end(), mystruct );
    if ( iter != cont.end() )
        std::cout << "First: " << iter->first << " Second: " << iter->second << " Res: " << iter->res;
    std::cin.get();
    return 0;
}

Если бы читал Страуструпа, так использовал бы уже готовые алгоритмы давно.
Но если так сильно хочется имть велосипед ... smile
Код

ContMy::iterator myfind(TMyStruct& mystruct, ContMy& cont) //Такие алгоритмы итераторы должны возвращать
{  
    ContMy::iterator iter;
    for (iter = cont.begin(); iter != cont.end() && !(*iter == mystruct); ++iter)
      //  if ((*iter).first== mystruct.first && (*iter).second== mystruct.second)//отредактировал ... //Что за великие комбинации "(*...)."? Ведь можно "...->" К тому же оператор сравнения уже есть - нафига это?
    return iter;
}

К тому же подключая все пространство имент при помощи using namespace std; у тебя получается конфликт имен ... есть такая функция std::find - она режется с твоей find, поэтому нужно либо менять название своей функции, либо не подключать СРАЗУ все пространство имен.

Это сообщение отредактировал(а) Xenon - 22.8.2007, 14:56


--------------------
user posted image  
PM MAIL   Вверх
zkv
Дата 22.8.2007, 14:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


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

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



Цитата(conio @  22.8.2007,  14:28 Найти цитируемый пост)
А какой STL контейнер наиболее подходит для линейного поиска? 

все подходят, только в случае ассоциативных контейнеров (set, map и пр. ) это не рационально, так как в них элементы упорядочиваются при заполнении, и следует это свойство использовать.
PM MAIL   Вверх
conio
Дата 23.8.2007, 14:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Мне стало интересно можно ли переопределить итератор insert контейнера set, внутри моей структуры?


PM MAIL   Вверх
JackYF
Дата 23.8.2007, 14:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

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



Цитата(conio @  23.8.2007,  14:01 Найти цитируемый пост)
Мне стало интересно можно ли переопределить итератор insert контейнера set

ты можешь определить оператор сравнения твоих структур. У контейнера set уже давно всё прекрасно определено.


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
conio
Дата 23.8.2007, 14:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата

У контейнера set уже давно всё прекрасно определено

Да это вобщем то понятно))

Я к тому чтобы внутри моей структуры был метод добавления в контейнер.
А как я добьюсь токого эффекта с помощью оператора сравнения структур?

Заранее спасбо))
PM MAIL   Вверх
Xenon
Дата 23.8.2007, 14:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



conio, твоя структура ничего не должна знать о контейнере.


--------------------
user posted image  
PM MAIL   Вверх
conio
Дата 23.8.2007, 15:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Хорошо, а если изменить реализацию.
Cделать структуру отдельно, и реализовать класс на ее основе.
Как мне в интерфейс класса добавить возможность пополнения контейнера?
Только с помощью оператора сравнения?
PM MAIL   Вверх
Xenon
Дата 23.8.2007, 15:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Что? При чем тут оператор сравнения? Что ты хочешь сделать вообще объясни толком. Чтобы у твоего класса был метод addMeSuchACuteAndPrettyToANiceAndNiftyContainer(Container& cont)? Зачем?


--------------------
user posted image  
PM MAIL   Вверх
conio
Дата 23.8.2007, 15:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Мне нужна структура и чтобы в ее интерфейсе был метод добавления новой записи в контейнер!

PM MAIL   Вверх
zkv
Дата 23.8.2007, 15:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


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

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



Цитата(conio @  23.8.2007,  15:45 Найти цитируемый пост)
Мне нужна структура и чтобы в ее интерфейсе был метод добавления новой записи в контейнер!

Код

struct MYSTRUCT
{
    int data;
    void AddMe( std::vector<MYSTRUCT> &vec )
    {
        vec.push_back( *this );
    }
};

все вопросы типа: "нафиг это нужно?" к автору
PM MAIL   Вверх
Earnest
Дата 24.8.2007, 18:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

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



Цитата(conio @  23.8.2007,  16:45 Найти цитируемый пост)
Мне нужна структура и чтобы в ее интерфейсе был метод добавления новой записи в контейнер!

Не нужна тебе такая структура... И никому не нужна.
Сам подумай: контейнеров есть много хороших и разных, стандартных и не очень. В какой именно будем добавлять? Во все? Так не выйдет... 
И не надо путать суп с мухами... smile 



--------------------
...
PM   Вверх
conio
Дата 27.8.2007, 10:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Спасибо всем за советы и за внимание! ...
по своей дилетантности не думал что структура и обьявленный контейнер по структуре должны быть самостоятельными обьектами. Думал что обьявил структуру, контейнер ... и все механизмы по работе с контайнером должны лежать в интерфейсе структуры, что оказывается неверным.

Еще раз спасибо!
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

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

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


 




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


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

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