Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как сравнить 2 string-а. 
:(
    Опции темы
kronos_vano
Дата 7.10.2007, 11:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 41
Регистрация: 13.7.2007

Репутация: нет
Всего: нет



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

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

PM MAIL   Вверх
W4FhLF
Дата 7.10.2007, 11:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


found myself
****


Профиль
Группа: Участник Клуба
Сообщений: 2831
Регистрация: 2.12.2006

Репутация: 20
Всего: 121



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


Нет.


--------------------
"Бог умер" © Ницше
"Ницше умер" © Бог
PM ICQ   Вверх
MAKCim
Дата 7.10.2007, 11:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 52
Всего: 207



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


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
bsa
Дата 7.10.2007, 11:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



Думаю, это немного оптимальней, но полной уверенности нет:
Код
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 это не конкурент точно.

Это сообщение отредактировал(а) bsa - 7.10.2007, 11:55
PM   Вверх
kronos_vano
Дата 7.10.2007, 12:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 41
Регистрация: 13.7.2007

Репутация: нет
Всего: нет



Спасибо за ответы
PM MAIL   Вверх
W4FhLF
Дата 7.10.2007, 13:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


found myself
****


Профиль
Группа: Участник Клуба
Сообщений: 2831
Регистрация: 2.12.2006

Репутация: 20
Всего: 121



MAKCim, на коротких строках смысла нет, но про длину строк конечно ничего не сказано. 

Это сообщение отредактировал(а) W4FhLF - 7.10.2007, 13:01


--------------------
"Бог умер" © Ницше
"Ницше умер" © Бог
PM ICQ   Вверх
archimed7592
Дата 7.10.2007, 13:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 58
Всего: 93



Велосипедисты, блин...

Код

#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.


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
bsa
Дата 7.10.2007, 13:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



archimed7592, а если в твоем случае строка b окажется короче, строки a, то что будет?
http://www.sgi.com/tech/stl/mismatch.html читаем Preconditions
PM   Вверх
archimed7592
Дата 7.10.2007, 13:54 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 58
Всего: 93



Цитата(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.


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
bsa
Дата 7.10.2007, 14:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



archimed7592, блин. и не докопаешься  smile 
PM   Вверх
archimed7592
Дата 7.10.2007, 14:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 58
Всего: 93



А и не надо smile.


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0539 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.