Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 18.11.2011, 16:41   #1
Mandrivnyk
Software Developer
Участник клуба
 
Аватар для Mandrivnyk
 
Регистрация: 01.03.2011
Сообщений: 1,098
По умолчанию Адаптеры и итераторы

Доброго времени суток, коллеги -)
Собственно, вопрос по сабжу.
Короче, есть такой маленький фрагмент кода:

Код:
string str;
getline(cin, str);
stringstream ss(str);

// Принимает введенную с клавиатуры строку и выводит слова, в которых есть хотя бы одна буква "q"
for (istream_iterator<string> Itr(ss); Itr != istream_iterator<string>(); +Itr)
    if (find_if(Itr->begin(), Itr->end(), bind2nd(equal_to<char>(), 'q')) != Itr->end())
        cout << *Itr << endl;
Он работает.
Но дело в том, что мне хотелось бы вместо условия "есть хотя бы одна буква "q" сделать "есть хотя бы одна из букв "qwert", например...
То есть, я понимаю, что есть метод find_first_of() с одной стороны, и адаптеры mem_fun(), mem_fun_ref() и иже с ними, с другой.
Но вот что-то прикрутить одно к другому как-то не получается...
Толкните в нужную сторону, а?
Ну, или покажите, как их связать -)

Заранее спасибо
Болтовня ничего не стоит. Покажите мне код. (c) Linus Torvalds
Помог ответ? -- Поставьте отзыв.
Выражения особой благодарности в рублевом эквиваленте отправлять сюда --> R269634919062
Mandrivnyk вне форума Ответить с цитированием
Старый 18.11.2011, 17:54   #2
Сыроежка
Форумчанин
 
Регистрация: 01.07.2011
Сообщений: 423
По умолчанию

Вы все смешали в одну кучу! Ваш итератор Itr указывает на объект типа std::string, поэтому вы можете воспользоваться собственными алгоритмами поиска класса std::string без всякого дополнительного вызова обобщенных алгоритмов.

Более того даже в вашем исходном коде совершенно не понятно, зачем вы используете алгоритм std::find_if вместо обычного безусловного алгоритма std::find?!

Всю эту строчку

Код:
if (find_if(Itr->begin(), Itr->end(), bind2nd(equal_to<char>(), 'q')) != Itr->end())
можно заменить вызовом
Код:
if ( Itr->find( 'q' ) != std::string::npos )
Кстати сказать, в классе std::string есть нужные вам алгоритмы. И никакой boost не нужен. Не слушайте всякий бред. Есть такое понятие KISS, означающее, делай проще, идиот.
Со мной можно встретиться на www.clipper.borda.ru

Последний раз редактировалось Сыроежка; 18.11.2011 в 18:39.
Сыроежка вне форума Ответить с цитированием
Старый 18.11.2011, 18:27   #3
Rififi
Старожил
 
Регистрация: 19.08.2009
Сообщений: 2,119
По умолчанию

Mandrivnyk

То есть, я понимаю, что есть метод find_first_of() с одной стороны, и адаптеры mem_fun(), mem_fun_ref() и иже с ними, с другой.

никаких memfun здесь не надо.

Код:
for (I it(ss); it != I(); ++it)
{
	if (it->find_first_of("aw") != std::string::npos)
		std::cout << *it << std::endl;
}
адаптеры могли бы понадобиться в алгоритмах типа for_each, copy_if etc, но во-первых стандартными биндингами C++ тут все равно не обойдешься, а применяя boost, начинаешь задумываться: "а оно точно надо?" (((Ж

Код:
std::copy_if(I(ss), I(), O(std::cout, " "), phx::bind<size_t>((size_t (std::string::*)(const char*, size_t) const) &std::string::find_first_of , _1, "any letters", 0) != std::string::npos);
Rififi вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Пропали Сетевые Адаптеры в Диспетчере устройств. boolimac Компьютерное железо 5 24.10.2010 00:46
итераторы и vector.erase( Teksa Общие вопросы C/C++ 5 28.04.2010 15:05