2013-04-11 7 views
0

У меня есть следующий вопрос:предиката для алгоритмов STL

find_if(s.begin(), s.end(), isalpha); 

s является строкой библиотеки. когда я пытаюсь использовать isalpha (в заголовке «cctype»), он говорит, что «type не соответствует». Проблема заключается в том, что ISALPHA принимает Int и возвращает Int: Int ISALPHA (интермедиат)

Я решил его, объявив другую функцию:

bool IsAlpha(char c) { 
    return isalpha(c); 
} 

Однако, есть ли лучший способ сделать это? Я бы предпочел лучшую четкость кода & простоту, не объявляя эту функцию «обертки».

Спасибо!

+0

Что я делаю неправильно? http://liveworkspace.org/code/28S1na$0 – ForEveR

+0

Алан, можете ли вы привести точную ошибку компилятора и точный код, для которого вы его получаете? До, чем, -1. –

+0

Я уверен, что был хотя бы один компилятор, который хотел, чтобы вы его произвели: '(int (*) (int)) isalpha' – chris

ответ

2

Я полагаю ++ путь «правильный» C является использование isalpha, определенной в локали:

std::find_if(
    s.begin(), 
    s.end(), 
    [](char c) { return std::isalpha(c, std::locale()); } 
); 

Немного многословной может быть.

+0

Может быть немного многословным, но вы всегда можете сохранить лямбду для последующего повторного использования или написать обертку. –

+0

Возможно, стоит определить полиморфный функтор ('struct isalpha_functor {template bool operator() (CharT c) {return std :: isalpha (c, std :: locale());}};') поскольку он может использоваться со всеми типами символов ('char',' wchar_t', 'char16_t' и' char32_t'). –

0

Ваше решение прекрасно выглядит для меня. Кроме того, что он имеет очень распространенную ошибку

bool IsAlpha(char c) { 
    return isalpha(c); 
} 

должен быть

bool IsAlpha(char c) { 
    return isalpha((unsigned char)c); 
} 

ISALPHA определяется только для значений без знака Char (которые обычно от 0 до 255) и EOF (которые, как правило, -1). Строго говоря, передача любого другого отрицательного значения в isalpha не определена. Однако на практике вы обнаружите, что (при условии, что ваш тип символа подписан), если вы передадите свою рутину символу с кодом 255, вы в конечном итоге передадите значение -1 в isalpha, которое всегда будет возвращать false.

+0

Вы видели комментарий ForEveR по этому вопросу? Если бы вы это сделали, вы бы знали, что решение неверно, потому что проблема не существует в первую очередь. –

+1

Что это все? isalpha принимает 'int', а не' unsigned char'. И он отлично работает при передаче 'char', который неявно конвертируется в' int'. –

+0

@JanHudec Я предполагаю, что OP не ошибается, когда он говорит, что у него ошибка компилятора. – john

0

Как насчет использования функторов?

struct IsAlpha { 
     bool operator() (char c) const { return /* isAlpha logic here */; }   
    }; 
    //... 
    find_if(begin, end, IsAlpha()); 

Посмотрите на преимущества использования функторов с СТЛ алгоритмов here

+0

За исключением этого случая я не вижу никакого преимущества. –

+0

@Jan, чтобы указать несколько преимуществ, функторы могут быть полиморфными, компиляторы могут встроить функторы (не используя функцию), действуют как удобные аргументы шаблона, список продолжается ... – Arun

+0

Но в этом случае они не нужны. Хотя, на самом деле шаблон _polymorphic_ был бы хорош здесь, поскольку 'std :: isalpha' является шаблоном. –

1

Единственный способ, что я могу себе представить, что вы используете using namespace std, так как вы написали find_if, не std::find_if и в этом случае имеет следующие ошибки Live example. Вы не пишете обертку, вы можете просто использовать ::isalphaLive example, или вы можете привязать второй пар к стандартным языкам, например here

Смежные вопросы