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


Автор: SolRus 18.5.2012, 04:50
подскажите как к примеру искать в структурах, а также в структуре по 1 параметру?
http://liveworkspace.org/code/50c86e107a421e9e78a188e2544dd918 или вот код:
Код

#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)?

Автор: disputant 18.5.2012, 05:04
Описать оператор сравнения в mData:

Код

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


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

Да, и звездочки при *it в операции вывода на экран не забудьте удалить, раз уж используете ->. Или используйте точку, но тогда нужны скобки вокруг *it.

Автор: borisbn 18.5.2012, 08:51
делаешь 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/6f941f83fdfb76e4a4f994f2151b9d88

Автор: borisbn 18.5.2012, 10:58
если не брезгуешь 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/835638bab944d32f3f3ba94cb48b358d

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

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


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

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

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

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

оператор == не даст тебе возможности искать по одному полю...
скорость работы функтора и http://ru.wikipedia.org/wiki/C%2B%2B11#.D0.9B.D1.8F.D0.BC.D0.B1.D0.B4.D0.B0-.D1.84.D1.83.D0.BD.D0.BA.D1.86.D0.B8.D0.B8_.D0.B8_.D0.B2.D1.8B.D1.80.D0.B0.D0.B6.D0.B5.D0.BD.D0.B8.D1.8F целиком и полностью зависит от компилятора (от настроек оптимизации и т.п.)

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

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