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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> поиск в list stl, поиск по полю класса в списке list stl 
V
    Опции темы
Hvoin
Дата 7.6.2008, 03:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



есть класс

Код

class parent 
{
    string Name;
    int Power;
};

от него наследут
class  children:public perent  
{
    int Run;
};



есть список
list<parent*> fact;

как сделать поиск по Name, Power и Run в списке fact?


 ! 
chipset
Теги [code] рулят форева.



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


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 4071
Регистрация: 11.1.2003
Где: Seattle, US

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



1. Простейший случай: find_if.
2. Сложнейший случай: boost::lambda.


--------------------
Цитата(Jimi Hendrix)
Well, I stand up next to a mountain
And I chop it down with the edge of my hand
PM MAIL WWW   Вверх
d06osipov
Дата 7.6.2008, 08:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Общий случай: for;
Быстрее, чем for всё равно не получится, это же список
PM MAIL   Вверх
Lazin
Дата 7.6.2008, 09:35 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

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



ну можно еще отмапить список если скорость поиска критична... 

Код

std::list<parent*> values;

std::map<std::string, std::list<parent*>::iterator> name_mapping;

...

for(std::list<parent*>::iterator i = values.begin(); i != values.end(); ++i)
{
   name_mapping[ (*i)->Name ] = i;
}

parent* find_by_name(std::string name)
{
  return *(name_mapping[name]);
}

PM MAIL Skype GTalk   Вверх
Rififi
Дата 7.6.2008, 12:13 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(Hvoin @  7.6.2008,  03:57 Найти цитируемый пост)
как сделать поиск по Name, Power и Run в списке fact?

поиск по Name, Power - см. выше
поиск по Run - никак.
PM MAIL   Вверх
Hvoin
Дата 7.6.2008, 18:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



а если так
Код

list<parent*> fact;
parent* p;
string ss="Petr Petrov";
int ii=2;
int rr=22;
p= new children(ss,ii,rr);
fact.push_back(p);

у меня много наследников и поиск предназачен для них

как с помощью find_if найти ss,ii,rr...Знаю что нужно перегрузить () только где, и как...какой 
параметр должен быть третим...или rr нельзя найти с помощью find_if?

Код

Find_if(fact.begin(),fact.end(),???)


Это сообщение отредактировал(а) Hvoin - 7.6.2008, 18:10
PM MAIL   Вверх
Rififi
Дата 7.6.2008, 20:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(Hvoin @  7.6.2008,  18:08 Найти цитируемый пост)
как с помощью find_if найти ss,ii,rr...Знаю что нужно перегрузить () только где, и как...какой 


велосипедный способ
Код
template <typename T, typename Class, T Class::*member_ptr>
struct field_selector : public std::unary_function<Class*, bool>
{
    typedef std::unary_function<Class*, bool> base_type;
    typedef typename base_type::argument_type argument_type;
    typedef typename base_type::result_type result_type;

    field_selector(const T& v) : v_(v) {}
    result_type operator()(const argument_type& it) const { return v_ == it->*member_ptr; }
    T v_;
};

std::vector<parent*> v;
std::find_if(v.begin(), v.end(), field_selector<int, parent, &parent::Power>(2));
std::find_if(v.begin(), v.end(), field_selector<std::string, parent, &parent::Name>("Petr Petrov"));


boost-способ
Код
std::vector<parent*> v;
std::find_if(v.begin(), v.end(), boost::bind(&parent::Power, _1) == 2);
std::find_if(v.begin(), v.end(), boost::bind(&parent::Name, _1) == "Petr Petrov");


PM MAIL   Вверх
Hvoin
Дата 7.6.2008, 21:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



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


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 4071
Регистрация: 11.1.2003
Где: Seattle, US

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



Метод Rififi не решает проблему поиска rr афаир. Для того что-бы решить проблему аки:

Код

class base
{
public:

};

class child : public base
{
public:
int m_Data;
}

int main()
{
list<base*> baseList; //<---
}



следует набросать самопальную рефлекцию, в простейшем случае:

Код

class base
{
public:
virtual int get_intProperty(string property_) = 0;
};

class child : public base
{
public:
int m_Data;
virtual int get_intProperty(string property_)
{
   if("m_Data" == property_) return m_Data;
}
};




Это просто ужасно.

Добавлено через 5 минут и 16 секунд
И даже вот так можно исхитритцо:

Код


class base
{
public:
virtual void setValues() = 0;
};

class child : public base
{
public:
  int m_Data;
  virtual void setValues() { m_Data = 3; }
};

int main()
{
base* a = new child();
a->setValues();

child *o = reinterpret_cast<child*>(a);

cout<<o->m_Data;

}




Добавлено через 5 минут и 53 секунды
Теперь тока запихни все это в функтор и радуйся жжизни smile


--------------------
Цитата(Jimi Hendrix)
Well, I stand up next to a mountain
And I chop it down with the edge of my hand
PM MAIL WWW   Вверх
bsa
Дата 7.6.2008, 21:31 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

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



chipset, уж лучше вместо reinterpret_cast использовать dynamic_cast - он хоть 0 возвратит в случае неверного преобразования.
PM   Вверх
chipset
Дата 7.6.2008, 21:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 4071
Регистрация: 11.1.2003
Где: Seattle, US

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



Цитата(bsa @  7.6.2008,  11:31 Найти цитируемый пост)
chipset, уж лучше вместо reinterpret_cast использовать dynamic_cast - он хоть 0 возвратит в случае неверного преобразования.

+1


--------------------
Цитата(Jimi Hendrix)
Well, I stand up next to a mountain
And I chop it down with the edge of my hand
PM MAIL WWW   Вверх
Rififi
Дата 7.6.2008, 21:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(chipset @  7.6.2008,  21:10 Найти цитируемый пост)
Метод Rififi не решает проблему поиска rr афаир.

это проблема не поиска, а кривого проектирования.
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.0568 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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