2012-02-21 2 views
0
#include <boost/spirit/home/support/char_encoding/ascii.hpp> 

bool IsStringAllNonLowercaseA(const std::string& str) 
{ 
    std::string newStr(str); 

    boost::to_upper(newStr); 

    if (newStr == str) 
     return true; 
    else 
     return false; 
} 

bool IsStringAllNonLowercaseB(const std::string& str) 
{ 
    for (std::string::const_iterator iter=str.begin(); iter != str.end(); ++iter) 
    { 
     if (boost::spirit::char_encoding::ascii::islower(*iter)) 
      return false; 
    } 
    return true; 
} 

Вопрос> Ищу эффективный способ проверки того, содержит ли std::string все заглавные буквы. Лучше всего, если есть стандартная функция из стандартной или ускорительной библиотеки C++.Проверьте std :: string, содержит ли любой строчный символ?

Я сам реализовал две версии. Но я не уверен, достаточно ли они. Любые предложения и комментарии приветствуются.

+0

http://codereview.stackexchange.com –

+0

Пожалуйста определить, что означает «достаточно хорошо». По каким критериям вы планируете выбрать «лучший» ответ из ответов, которые вы получите здесь? Также обратите внимание, что обнаружение любых символов в нижнем регистре (в виде запросов заголовков) не совпадает с обнаружением того, имеют ли символы все в верхнем регистре (по запросу тела). Знаки пунктуации, символы Дальнего Востока, символы и цифры обычно отсутствуют. –

+0

В принципе, я ищу предопределенную функцию, которая может сказать мне, содержит ли строка ни строчки. Ваша точка верна, и я изменил свое имя функции в OP. – q0987

ответ

5

Моя первая реакция, вероятно, будет что-то вроде этого:

return std::find_if(str.begin(), str.end(), ::islower) == str.end(); 

Если у вас есть C++ 11 доступны, вы также можете использовать:

return !std::any_of(str.begin(), str.end(), ::islower); 

Edit: Как Джеймс Kanze отметил, либо/оба из них могут/будут иметь неопределенное поведение при неправильном вводе (где «неправильный» означает почти что-либо вне основных символов ASCII, требуемых в наборе основных символов выполнения). Чтобы исправить это, значения должны быть переданы в unsigned char перед передачей в :: isupper.

struct IsUpper { 
    bool operator()(int value) { 
     return ::isupper((unsigned char)value); 
    } 
}; 

return std::find_if(str.begin(), str.end(), IsUpper()) == str.end(); 

или:

return !std::any_of(str.begin(), str.end(), IsUpper()); 

В качестве альтернативы можно использовать лямбда:

return std::find_if(str.begin(), str.end(), 
    [](int ch) { return ::isupper(unsigned char)ch);}) == str.end(); 

или:

return !std:any_of(str.begin(), str.end(), 
    [](char ch) { return ::isupper(unsigned char)ch)); }); 
+1

Я бы также использовал 'std :: find_if'. Но я проверил бы против итератора конца, а не 'std :: string :: npos' :-). –

+0

@JamesKanze: Хорошая точка. Исправлено - и спасибо. –

+1

И теперь, когда я думаю об этом, я бы также использовал функциональный объект, который я опубликовал ранее. ':: islower' имеет неопределенное поведение при вызове с аргументом' char' as (по крайней мере, если подписан символ 'char'). –

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