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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> поиск в STL структура, find 
V
    Опции темы
SolRus
Дата 18.5.2012, 04:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



подскажите как к примеру искать в структурах, а также в структуре по 1 параметру?
на liveworkspace или вот код:
Код

#include <iostream>
#include <algorithm>
#include <list>
#include <string>

using namespace std;

struct mData { 
   mData( int _a = 0, string _s = "") : a(_a), s(_s) {}
   int a;
   string s; 
};

int main () {
      list<mData> f;
      f.push_back(mData(4, "as"));
      f.push_back(mData(9, "bs"));
      f.push_back(mData(3, "cs")); 
      f.push_back(mData(1, "ds")); 
      f.push_back(mData(42, "es")); 
      f.push_back(mData(344, "fs")); 
      f.push_back(mData(41, "gs")); 
      f.push_back(mData(345, "hs")); 
          
      list<mData>::iterator it = find(f.begin(),f.end(), mData(42, "es"));
      if (*it->a != 0) cout << "find: " << *it->a << endl;

  return 0;
}

пытался найти mData(42, "es") (по всем параметрам) ошибка, также как найти по 1 параметру из структуры? к примеру 42 (только по int, исключая string)?
PM MAIL Skype   Вверх
disputant
Дата 18.5.2012, 05:04 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Описать оператор сравнения в mData:

Код

   bool operator == (const mData& m)
   {
       return (a == m.a) && (s == m.s);
   }


или использовать find_if, передавая ему компаратор.

Да, и звездочки при *it в операции вывода на экран не забудьте удалить, раз уж используете ->. Или используйте точку, но тогда нужны скобки вокруг *it.
PM MAIL   Вверх
borisbn
Дата 18.5.2012, 08:51 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

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



делаешь 2 функтора
Код
struct FullEqual {
   FullEqual( const mData & data ) : m_data( data ) {}
   bool operator()( const mData & it ) {
      return it.a == m_data.a && it.s == m_data.s;
   }
   const mData & m_data;
};

struct EqualByFirst {
   EqualByFirst( int a ) : m_a( a ) {}
   bool operator()( const mData & it ) {
      return it.a == m_a;
   }
   int m_a;
};

и вызываешь не find, а find_if:
Код
list< mData >::iterator it = find_if( f.begin(), f.end(), FullEqual( mData( 42, "es" ) ) );
it = find_if( f.begin(), f.end(), EqualByFirst( 344 ) );


http://liveworkspace.org/code/6f941f83fdfb...4f994f2151b9d88


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
borisbn
Дата 18.5.2012, 10:58 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

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



если не брезгуешь C++11, то можно и проще
Код

      list< mData >::iterator it = find_if( f.begin(), f.end(), 
         []( const mData & data ) {
            return data.a == 42 && data.s == "es";
      });

      it = find_if( f.begin(), f.end(), 
         []( const mData & data ) { return data.a == 344; }
      );

http://liveworkspace.org/code/835638bab944...f3ba94cb48b358d


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
SolRus
Дата 18.5.2012, 17:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



большое вам спасибо) 
через оператор сравнения по одному можно перегрузить
Код
bool operator == (const int &n) { return (a == n); }

и функторы понял, а вот с++11  запись выглядит странно необычно)
Код
[]( const mData & data ) { return data.a == 344; }


Цитата
если не брезгуешь

а почему должен брезгать? это ж новый стандарт...

вопрос решен, но интересно какой вариант(оператор,функтор,с++11) быстрее? чем можно проверить?

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


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

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



Цитата(SolRus @  18.5.2012,  17:20 Найти цитируемый пост)
интересно какой вариант(оператор,функтор,с++11) быстрее?

оператор == не даст тебе возможности искать по одному полю...
скорость работы функтора и лямбды целиком и полностью зависит от компилятора (от настроек оптимизации и т.п.)

и вообще, делай как тебе понятней, как удобнее использовать, чтобы код был понятным, расширяемым...
о скорости нужно думать тогда (и только тогда) когда 1) её не хватает 2) всё остальное написано и отлажено
погугли про преждевременную оптимизацию  smile 


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

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

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

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

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


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

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


 




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


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

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