crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

2 страниц V  < 1 2  
Ответить в данную темуНачать новую тему
> Перевод QString в другие типы
kin63camapa
  опции профиля:
сообщение 12.2.2011, 15:56
Сообщение #11


Студент
*

Группа: Участник
Сообщений: 32
Регистрация: 21.8.2010
Пользователь №: 1976

Спасибо сказали: 0 раз(а)




Репутация:   1  


Цитата(bigory @ 12.2.2011, 15:24) *
Мне нужно из строки abctrjhaabccctn, найти вхождение aab

у меня вот так получилось
    QString a="aab";
    QString b="abctrjhaabccctn";
    for (int i = 0;i<b.size();i++)
    {
        if (b[i] == a[0])
        {
            for (int x = 0;x<a.size();x++)
            {
                if (b[i+x] != a[x]) break;
                if (x == a.size()-1)
                {
                    qDebug() << i+1;
                }
            }
        }
    }

если нужно узнать не номер символа где вхождение а просто есть оно или нет то есть готовая функция b.contains(a);

Сообщение отредактировал kin63camapa - 16.2.2011, 10:59
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
maint
  опции профиля:
сообщение 12.2.2011, 16:18
Сообщение #12


Участник
**

Группа: Участник
Сообщений: 235
Регистрация: 3.8.2009
Из: Иркутск
Пользователь №: 982

Спасибо сказали: 28 раз(а)




Репутация:   2  


вы чего здесь несете ? С каких это пор к QString стало можно обращаться как к массиву ? Разум есть ? На край можно сделать обращение к букве как
s.toStdString().c_str()[i];


Сообщение отредактировал maint - 12.2.2011, 16:18
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
bigory
  опции профиля:
сообщение 12.2.2011, 16:40
Сообщение #13


Студент
*

Группа: Участник
Сообщений: 77
Регистрация: 10.10.2010
Пользователь №: 2099

Спасибо сказали: 0 раз(а)




Репутация:   0  


Спасибо! Все заработало

Цитата(maint @ 12.2.2011, 16:18) *
вы чего здесь несете ? С каких это пор к QString стало можно обращаться как к массиву ? Разум есть ? На край можно сделать обращение к букве как


Может быть и странно, но все работает

Раз работает, значит можно)))) практика показала)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
kwisp
  опции профиля:
сообщение 12.2.2011, 16:52
Сообщение #14


астарожна ынтжинэр
*****

Группа: Участник
Сообщений: 1404
Регистрация: 26.11.2008
Из: ТаганрогРодинаЧехова
Пользователь №: 435

Спасибо сказали: 113 раз(а)




Репутация:   23  


bigory,
читайте документацию. вхождение подстроки(символа, регвыражения) можно найти с помощью СТАНДАРТНОЙ функции члена.

ОФФ:


и четр возьми это намного быстрее чем ждать ответа на форуме.


maint,
у QString вполне есть методы типа:
QCharRef QString::operator[] ( int position )

kin63camapa,
метод нахождения подстроки возможно рабочий. но оптять же лучше документацию сначала полистать.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
kin63camapa
  опции профиля:
сообщение 12.2.2011, 17:18
Сообщение #15


Студент
*

Группа: Участник
Сообщений: 32
Регистрация: 21.8.2010
Пользователь №: 1976

Спасибо сказали: 0 раз(а)




Репутация:   1  


Цитата(maint @ 12.2.2011, 16:18) *
вы чего здесь несете ? С каких это пор к QString стало можно обращаться как к массиву ? Разум есть ? На край можно сделать обращение к букве как
s.toStdString().c_str()[i];

С 3 версии точно, раньше хз не застал. Просто помнить надо что там юникод а так оператор [] для чего-то написан а значит можно как и к любым qt шным контйнерам по индексу

Цитата(bigory @ 12.2.2011, 16:40) *
Спасибо! Все заработало

а плюсик))))

Цитата(maint @ 12.2.2011, 16:18) *
вы чего здесь несете ? С каких это пор к QString стало можно обращаться как к массиву ? Разум есть ? На край можно сделать обращение к букве как
s.toStdString().c_str()[i];

http://doc.crossplatform.ru/qt/4.3.2/qstri...#operator-5b-5d в догонку

Цитата(kwisp @ 12.2.2011, 16:52) *
читайте документацию. вхождение подстроки(символа, регвыражения) можно найти с помощью СТАНДАРТНОЙ функции члена.
метод нахождения подстроки возможно рабочий. но оптять же лучше документацию сначала полистать.

Покажите плз, или хотяб линк в доку.


Ну да, ваша взяла qt ищет с учетом регистра и в 2 раза быстрей ибо, насколько я понял, в однобитную кодировку переводит
int qFindString(
    const QChar *haystack0, int haystackLen, int from,
    const QChar *needle0, int needleLen, Qt::CaseSensitivity cs)
{
    const int l = haystackLen;
    const int sl = needleLen;
    if (from < 0)
        from += l;
    if (uint(sl + from) > (uint)l)
        return -1;
    if (!sl)
        return from;
    if (!l)
        return -1;

    if (sl == 1)
        return findChar(haystack0, haystackLen, needle0[0], from, cs);

    /*
        We use the Boyer-Moore algorithm in cases where the overhead
        for the skip table should pay off, otherwise we use a simple
        hash function.
    */
    if (l > 500 && sl > 5)
        return qFindStringBoyerMoore(haystack0, haystackLen, from,
            needle0, needleLen, cs);

    /*
        We use some hashing for efficiency's sake. Instead of
        comparing strings, we compare the hash value of str with that
        of a part of this QString. Only if that matches, we call
        ucstrncmp() or ucstrnicmp().
    */
    const ushort *needle = (const ushort *)needle0;
    const ushort *haystack = (const ushort *)haystack0 + from;
    const ushort *end = (const ushort *)haystack0 + (l-sl);
    const int sl_minus_1 = sl-1;
    int hashNeedle = 0, hashHaystack = 0, idx;

    if (cs == Qt::CaseSensitive) {
        for (idx = 0; idx < sl; ++idx) {
            hashNeedle = ((hashNeedle<<1) + needle[idx]);
            hashHaystack = ((hashHaystack<<1) + haystack[idx]);
        }
        hashHaystack -= haystack[sl_minus_1];

        while (haystack <= end) {
            hashHaystack += haystack[sl_minus_1];
            if (hashHaystack == hashNeedle
                 && ucstrncmp((const QChar *)needle, (const QChar *)haystack, sl) == 0)
                return haystack - (const ushort *)haystack0;

            REHASH(*haystack);
            ++haystack;
        }
    } else {
        const ushort *haystack_start = (const ushort *)haystack0;
        for (idx = 0; idx < sl; ++idx) {
            hashNeedle = (hashNeedle<<1) + foldCase(needle + idx, needle);
            hashHaystack = (hashHaystack<<1) + foldCase(haystack + idx, haystack_start);
        }
        hashHaystack -= foldCase(haystack + sl_minus_1, haystack_start);

        while (haystack <= end) {
            hashHaystack += foldCase(haystack + sl_minus_1, haystack_start);
            if (hashHaystack == hashNeedle && ucstrnicmp(needle, haystack, sl) == 0)
                return haystack - (const ushort *)haystack0;

            REHASH(foldCase(haystack, haystack_start));
            ++haystack;
        }
    }
    return -1;
}


Сообщение отредактировал kin63camapa - 16.2.2011, 11:08
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 12.2.2011, 22:24
Сообщение #16


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(bigory @ 12.2.2011, 16:10) *
выдает ошибку.
какую ошибку?


bigory, ты что надеешься, что кто-то будет угадыванием заниматься?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

2 страниц V  < 1 2
Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


4 чел. читают эту тему (гостей: 4, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 16.1.2025, 0:02