Поиск слова определенной длины.
От: Astral29 Эстония  
Дата: 29.09.07 17:29
Оценка:
Здравствуйте.

Не подскажете ли многоуважаемые, как мне, используя только стандартные средства STL (VC8)
найти слова определенной длины в векторе? Именно используя только библиотечные объекты функции. Если написать свой предикт, то задача решается просто. Хотелось бы именно
стандартными средствами.

Напимер, есть вектор строк:
vector<string> words;

Если бы я испоьзовал свой предикт, то всё просто:
class EQ_cls {
public:
   EQ_cls(size_t val = 0): bound(val) { }
   bool operator()(const string &s) { return s.size == bound; }
private:
   std::string::size_type bound;
};

find_if(words.begin(), words.end(), EQ_cls(i));


А вот стандартными средствами не получается
Если бы это был вектор целых, то я знаю как:
find_if(ivec.begin(), ivec.end(), bind2nd(equal_to<int>(), i) );


А вот как с вектором строк — не ясно


Заранее спасибо.
WBR, Алексей
Re: Поиск слова определенной длины.
От: Roman Odaisky Украина  
Дата: 29.09.07 18:27
Оценка:
Здравствуйте, Astral29, Вы писали:

A>А вот как с вектором строк — не ясно :xz:


А вот так:
for(Container::const_iterator i = container.begin(); i != container.end(); ++i)
{
    if(i->size() == someSize)
    {
        doSomething(*i);
    }
}

Чем это хуже по сравнению с чем-то вроде
std::find_if(container.begin(), container.end(), boost::bind(&std::string::size, _1) == someSize)
?
До последнего не верил в пирамиду Лебедева.
Re[2]: Поиск слова определенной длины.
От: Astral29 Эстония  
Дата: 29.09.07 18:53
Оценка:
Здравствуйте, Roman Odaisky, Вы писали:

RO>А вот так:

-=skipped code=-
RO>Чем это хуже по сравнению с чем-то вроде
RO>
std::find_if(container.begin(), container.end(), boost::bind(&std::string::size, _1) == someSize)


Вопрос был не в том, что хуже. Я просто учу STL, и там в книге было такое задание.
Реально ли всё-таки это сделать с использованием только STL (VC8)?

WBR, Алексей
Re: Поиск слова определенной длины.
От: ilnar Россия  
Дата: 29.09.07 19:08
Оценка: 2 (1)
Здравствуйте, Astral29, Вы писали:


A>А вот стандартными средствами не получается


имхо, без средств комипозиции никак (((
а "композиторы" в VC8 нет ((
может гуру стандарта подскажет, есть ли стандартный код compose в стандарте??

если вставите вот такой код компосера:

template<typename F1, typename F2> class
unary_composer
: public unary_function<typename F2::argument_type,
                        typename F1::result_type> {
  F1 f1;
  F2 f2;
public:
  unary_composer(F1 f1, F2 f2) : f1(f1), f2(f2) {}
  typename F1::result_type
  operator()(typename F2::argument_type x) {
    return f1(f2(x));
  }
};

template<typename F1, typename F2>
unary_composer<F1, F2> compose(F1 f1, F2 f2) {
  return unary_composer<F1, F2>(f1, f2);
}


то будет счастье вида (проверку на длину 3):

find_if(sv.begin(), sv.end(), compose(bind2nd(equal_to<string::size_type>(), 3), mem_fun_ref(&string::size)));
Re[2]: Поиск слова определенной длины.
От: Sni4ok  
Дата: 29.09.07 19:47
Оценка:
Здравствуйте, Roman Odaisky, Вы писали:


RO>Чем это хуже по сравнению с чем-то вроде


тем, что вектор может измениться на сортированный вектор(после профайлинга к примеру), и захочется применять std::lower_bound а не простой обход всех элементов.
Re[3]: Поиск слова определенной длины.
От: Sni4ok  
Дата: 29.09.07 19:55
Оценка:
Здравствуйте, Astral29, Вы писали:

A>Вопрос был не в том, что хуже. Я просто учу STL, и там в книге было такое задание.

A>Реально ли всё-таки это сделать с использованием только STL (VC8)?

а зачем тут указывать, что vc8?

а с помощью stl' конечно это делается, функтор можно записать с помощью гнусных bind1st и bind2nd,
с помощью boost::bind он бы выглядел примерно так
boost::bind(std::equal_to<size_t>(),boost::bind(&std::string::size,_1), 10)
Re[4]: Поиск слова определенной длины.
От: Astral29 Эстония  
Дата: 29.09.07 20:07
Оценка:
Здравствуйте, Sni4ok, Вы писали:

S>а зачем тут указывать, что vc8?

VC8 указывается для того, что есть разные варианты STL. И в них есть свои дополнения.

S>а с помощью stl' конечно это делается, функтор можно записать с помощью гнусных bind1st и bind2nd,

S>с помощью boost::bind он бы выглядел примерно так
S>boost::bind(std::equal_to<size_t>(),boost::bind(&std::string::size,_1), 10)
Так а как "с помощью гнусных bind1st и bind2nd" это сделать?

WBR, Алексей
Re[5]: Поиск слова определенной длины.
От: Sni4ok  
Дата: 29.09.07 20:46
Оценка:
Здравствуйте, Astral29, Вы писали:

A>Так а как "с помощью гнусных bind1st и bind2nd" это сделать?


блин, я не маньяк чтобы это на стандартных биндерах делать)
плюс они очень не универсальны, поскольку будут разные для скажем обхода итераторов
по std::vector<std::string> и std::vector<std::string*>, так что с практической точки зрения они представляют мало интереса,
но с академический и для набивания руки конечно покатят.
Re[6]: Поиск слова определенной длины.
От: Astral29 Эстония  
Дата: 30.09.07 06:45
Оценка:
Здравствуйте, Sni4ok, Вы писали:

S>блин, я не маньяк чтобы это на стандартных биндерах делать)

S>плюс они очень не универсальны, поскольку будут разные для скажем обхода итераторов
S>по std::vector<std::string> и std::vector<std::string*>, так что с практической точки зрения они представляют мало интереса,
S>но с академический и для набивания руки конечно покатят.

Я тогда вообще не понимаю, зачем в книгах давать такие задания.
Причем задания там в основном на "понял/не понял" материал. Т.е., подразумевается,
что это просто сделать.

WBR, Алексей
Re[2]: Поиск слова определенной длины.
От: Astral29 Эстония  
Дата: 30.09.07 06:53
Оценка:
Здравствуйте, ilnar, Вы писали:

I>имхо, без средств комипозиции никак (((

I>а "композиторы" в VC8 нет ((

I>если вставите вот такой код компосера:

skipped
I>то будет счастье вида (проверку на длину 3):
skipped

Спасибо за ответ. Я предполагал, что всё это можно сделать проще...
А как оказалось — нет.

WBR, Алексей.
Re[7]: Поиск слова определенной длины.
От: ilnar Россия  
Дата: 30.09.07 07:57
Оценка:
Здравствуйте, Astral29, Вы писали:


A>Я тогда вообще не понимаю, зачем в книгах давать такие задания.

A>Причем задания там в основном на "понял/не понял" материал. Т.е., подразумевается,
A>что это просто сделать.

может все же там не требовали на чисто STL? может предполагаось написать функтор? при этом по всем правила типа наследования от унарной или бинарной функции (скорее этот)
Re[3]: Поиск слова определенной длины.
От: Roman Odaisky Украина  
Дата: 30.09.07 10:21
Оценка:
Здравствуйте, Sni4ok, Вы писали:

RO>>Чем это хуже по сравнению с чем-то вроде


S>тем, что вектор может измениться на сортированный вектор(после профайлинга к примеру), и захочется применять std::lower_bound а не простой обход всех элементов.


Не может он измениться. Структуры данных выбираются задолго до кодирования и потом не изменяются.
До последнего не верил в пирамиду Лебедева.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.