Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Как сравнить 2 string-а.


Автор: kronos_vano 7.10.2007, 11:31
Речь идет про std::string.
Я хочу узнать на какой букве они различаются, есть ли способ оптимальнее этого:
Код

string a,b;
//...
i=0;
while (a[i]==b[i])
  i++;

Автор: W4FhLF 7.10.2007, 11:36
Цитата(kronos_vano @  7.10.2007,  11:31 Найти цитируемый пост)
есть ли способ оптимальнее этого


Нет.

Автор: MAKCim 7.10.2007, 11:53
kronos_vano, 
если подключить с_str() + asm, тогда можно SIMD-инструкциями воспользоваться
например PCMPEQB

Автор: bsa 7.10.2007, 11:54
Думаю, это немного оптимальней, но полной уверенности нет:
Код
std::string a,b;
//....
std::string::const_iterator i,j;
for(i = a.begin(), j = b.begin(); (*i == *j) && (i != a.end()) && (j != b.end()); ++i, ++j);
if ( (i != a.end()) || (j != b.end()) ) {
    //строки различаются, позицию отличных символов можно узнать так:
    int idx = (i != a.end()) ? (i - a.begin()) : (j - b.begin());   //но может проще использовать *i и *j, как ссылки на символы?
}

P.S.: но c_str() + asm это не конкурент точно.

Автор: kronos_vano 7.10.2007, 12:03
Спасибо за ответы

Автор: W4FhLF 7.10.2007, 13:01
MAKCim, на коротких строках смысла нет, но про длину строк конечно ничего не сказано. 

Автор: archimed7592 7.10.2007, 13:33
Велосипедисты, блин...

Код

#include <algorithm>
#include <string>

using std::string;
using std::mismatch;
using std::size_t;

int main()
{
    string a = "12345", b = "12245";
    size_t i = mismatch(a.begin(), a.end(), b.begin()).first - a.begin();
}


Добавлено через 34 секунды
Цитата(W4FhLF @  7.10.2007,  13:01 Найти цитируемый пост)
но про длину строк конечно ничего не сказано. 

В особенности то, что они могут быть разными smile.

Автор: bsa 7.10.2007, 13:50
archimed7592, а если в твоем случае строка b окажется короче, строки a, то что будет?
http://www.sgi.com/tech/stl/mismatch.html читаем Preconditions

Автор: archimed7592 7.10.2007, 13:54
Цитата(bsa @  7.10.2007,  13:50 Найти цитируемый пост)
а если в твоем случае строка b окажется короче, строки a, то что будет?


Во-первых вот:
Цитата(archimed7592 @  7.10.2007,  13:33 Найти цитируемый пост)
Добавлено через 34 секунды
Цитата(W4FhLF @  7.10.2007,  13:01 Найти цитируемый пост)
но про длину строк конечно ничего не сказано. 

В особенности то, что они могут быть разными smile. 


Во-вторых, будет примерно то же самое, что и в случае с кодом из первого поста:

Цитата(kronos_vano @  7.10.2007,  11:31 Найти цитируемый пост)
i=0;
while (a[i]==b[i])
  i++;


Так что претензии к умеющим особо талантливо формулировать задачу smile.

Автор: bsa 7.10.2007, 14:13
archimed7592, блин. и не докопаешься  smile 

Автор: archimed7592 7.10.2007, 14:32
А и не надо smile.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)