2014-12-05 4 views
8

Я хотел бы реализовать сравнение строк в C++, сравнивая строки до знака "%".C++ сравнить строки до "%" char

я мог бы сделать это следующим образом:

std::equal(str1.begin(), 
      std::find(str1.begin(), str1.end(), L'%'), 
      str2.begin()); 

Поскольку я делаю это в цикле на протяжении многих строк, мне интересно, если есть способ без двух различных струнных обходов для find и equal (возможно, с предикат, который может прервать сравнение в любой точке). Boost в порядке.

+1

Не могли бы вы привести примеры строк, которые вы сравниваете? Существует не менее 3 разных интерпретаций ваших входных строк. –

+0

"Текущий том: \"% 1 \ "" против "Текущий том: \" C: \ "" –

+0

Является ли 'str1' всегда содержать'% 'или может' str2' иметь его, но не 'str1'? – greatwolf

ответ

12

Вы можете попробовать std::mismatch.
Следующий код будет работать с C++ 14 (это требует перегрузки шаблон с двумя парами итераторов), но она работает очень похож на C++ 11 (или 03, без лямбды, хотя):

auto iters = std::mismatch(str1.begin(), str1.end(), str2.begin(), str2.end(), 
        [] (char lhs, char rhs) {return lhs != '%' && lhs == rhs;}); 


if (iters.first == str1.end() 
|| iters.second == str2.end() 
|| *iters.first == '%') 
    // Success […] 

Demo ,

+0

Ницца приятно приятно! И std :: mismatch находится в C++ 03, который является бонусом. –

2

Вот хак способ сделать это:

auto it = std::find_if(
    str1.begin(), str1.end(), 
    [&str2](const char &c) { 
    return c == '%' || str2[&c - &str1[0]] != c 
    } 
); 
bool equal = (it == str1.end() || *it == '%'); 

Идея заключается в том, чтобы создать предикат «характер такой же, как и в другой строке, а не в '%'».

Он полагается на str2, будучи достаточно длинным, но и код в вопросе.

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