Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets > [Qt] Создание QString с помощью 2-х итераторов


Автор: rudvil 11.3.2010, 23:07
Посоветуйте, как извратиться(в хорошем смысле), чтобы можно было сконструировать QString с помощью 2-ух QString::const_iterator
Код
typedef QString::const_iterator qiter;

QString qtest = "sHello!";

qiter qbeg = qtest.begin();
qiter qend = qtest.end();

++qbeg;

???

так-же, как в stl
Код
typedef std::string::const_iterator iter;

std::string test = "sHello!";

iter beg = test.begin();
iter end = test.end();

++beg;

std::string str(beg, end); // str содержит в себе "Hello!"

В доках копался:
конструктора для таких вещей нету, похожих функц. тоже...
Пока что только одна идея, но не думаю что это лучший выход из положения...
Код
QString qtest = "sHello!";

qiter qbeg = qtest.begin();
qiter qend = qtest.end();

++qbeg;

QString str;

for (; qbeg != qend; qbeg++) {
    str += *qbeg;
}

Автор: andrew_121 11.3.2010, 23:26
как-то по человечески, не получится.
Qt не очень приспособлена для алгоритмов. STL другое дело.

Автор: rudvil 11.3.2010, 23:44
Цитата(andrew_121 @ 11.3.2010,  22:26)
как-то по человечески, не получится.
Qt не очень приспособлена для алгоритмов. STL другое дело.

Жалко..., andrew_121 как считаете, есть какие либо приемущества у QT-подобных контейнеров против stl?
Решил раз уж QT так QT...
Я бы и не парился с QString, но у него удобная поддержка уникода, а именно у QChar-isLetter(не только a-zA-Z) и.т.д.

Автор: borisbn 12.3.2010, 00:00
А почему не так
Код

QString str = qtest.right( qtest.size() - 1 );

по поводу преимуществ Qt-контейнеров перед stl: расширенный набор функций, например http://qt.nokia.com/doc/4.6/qlist.html#takeFirst, а не 
Код

x = list.front();
list.pop_front();

недостатки: невозможность использование своего классика, написанного с использованием Qt, в простых приложениях, где в Qt нет необходимости 

Автор: rudvil 12.3.2010, 00:28
Цитата(borisbn)
А почему не так...

То был лишь пример, на самом деле позиции итераторов могут быть где угодно, хоть посередине текста.
Цитата(borisbn)
по поводу преимуществ Qt-контейнеров перед stl: расширенный набор функций, например QList::takeFirst()

Это да, согласен там много чего удобного =]
Цитата(borisbn)
недостатки: невозможность использование своего классика, написанного с использованием Qt, в простых приложениях, где в Qt нет необходимости

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

з.ы. провел несколько грязных тестов... от результатов в шоке, не думал что qt может быть настолько шустрее
Компилировал в QT Creator(release)
вот код
Код
#include <QString>
#include <QVector>
#include <string>
#include <vector>
#include <ctime>
#include <iostream>

double execTime (clock_t beg, clock_t end) {
    double result = (beg - end) / (CLOCKS_PER_SEC/1000);
    return result;
}

int main (int argc, char* argv[]) {
    /* vectors test */
    std::cout << "\nstd::vector + std::string\n";
    for (int j = 0; j < 100; j++) {
        std::string str = "Hello World!\n";
        clock_t begin = clock();
        std::vector<std::string> v1, v2;
        for (int i = 0; i < 100000; i++)
            v1.push_back(str);
        for (int i = 0; i < 100000; i++)
            v2.push_back(v1.at(i));
        clock_t end = clock();
        std::cout << execTime(end, begin) << ", ";
        if (j % 5 == 0)
            std::cout << "\n";
    }
    std::cout << "\nstd::vector + QString\n";
    for (int j = 0; j < 100; j++) {
        QString str = "Hello World!\n";
        clock_t begin = clock();
        std::vector<QString> v1, v2;
        for (int i = 0; i < 100000; i++)
            v1.push_back(str);
        for (int i = 0; i < 100000; i++)
            v2.push_back(v1.at(i));
        clock_t end = clock();
        std::cout << execTime(end, begin) << ", ";
        if (j % 5 == 0)
            std::cout << "\n";
    }
    std::cout << "\nQVector + std::string\n";
    for (int j = 0; j < 100; j++) {
        std::string str = "Hello World!\n";
        clock_t begin = clock();
        QVector<std::string> v1, v2;
        for (int i = 0; i < 100000; i++)
            v1.push_back(str);
        for (int i = 0; i < 100000; i++)
            v2.push_back(v1.at(i));
        clock_t end = clock();
        std::cout << execTime(end, begin) << ", ";
        if (j % 5 == 0)
            std::cout << "\n";
    }
    std::cout << "\nQVector + QString\n";
    for (int j = 0; j < 100; j++) {
        QString str = "Hello World!\n";
        clock_t begin = clock();
        QVector<QString> v1, v2;
        for (int i = 0; i < 100000; i++)
            v1.push_back(str);
        for (int i = 0; i < 100000; i++)
            v2.push_back(v1.at(i));
        clock_t end = clock();
        std::cout << execTime(end, begin) << ", ";
        if (j % 5 == 0)
            std::cout << "\n";
    }
    return 0;
}

вот результаты
Код

std::vector + std::string
25, 
18, 17, 18, 17, 18, 
18, 18, 18, 18, 18, 
18, 18, 18, 18, 18, 
18, 18, 18, 17, 18, 
18, 18, 18, 17, 17, 
18, 18, 18, 17, 18, 
18, 18, 18, 18, 18, 
17, 18, 17, 17, 17, 
17, 17, 20, 18, 18, 
21, 26, 19, 19, 18, 
17, 18, 18, 18, 18, 
18, 18, 17, 18, 18, 
18, 18, 17, 18, 18, 
18, 18, 18, 17, 18, 
18, 17, 18, 18, 18, 
18, 17, 18, 19, 17, 
18, 18, 18, 18, 17, 
18, 18, 19, 19, 19, 
18, 18, 18, 17, 18, 
17, 17, 18, 18, 
std::vector + QString
12, 
10, 11, 11, 11, 11, 
10, 11, 11, 11, 12, 
10, 11, 11, 11, 12, 
10, 11, 11, 11, 11, 
11, 12, 11, 12, 12, 
11, 11, 11, 11, 12, 
12, 11, 12, 11, 11, 
11, 11, 10, 11, 11, 
11, 10, 11, 12, 11, 
11, 11, 11, 12, 11, 
12, 11, 11, 11, 11, 
11, 11, 10, 11, 11, 
11, 11, 11, 11, 11, 
11, 11, 11, 12, 11, 
12, 11, 11, 10, 11, 
10, 11, 11, 11, 11, 
11, 11, 10, 11, 10, 
11, 11, 11, 10, 11, 
11, 11, 11, 11, 10, 
11, 11, 11, 11, 
QVector + std::string
34, 
34, 33, 33, 34, 36, 
34, 33, 34, 32, 34, 
34, 32, 34, 34, 33, 
36, 34, 36, 37, 35, 
36, 36, 39, 33, 34, 
32, 33, 32, 33, 33, 
33, 34, 33, 32, 34, 
34, 35, 32, 34, 34, 
33, 34, 33, 34, 34, 
33, 32, 32, 34, 32, 
34, 32, 33, 33, 33, 
33, 33, 33, 33, 32, 
33, 34, 34, 32, 33, 
35, 33, 34, 33, 34, 
34, 32, 34, 36, 33, 
33, 34, 34, 33, 33, 
33, 34, 34, 32, 33, 
33, 33, 34, 33, 33, 
32, 32, 33, 33, 33, 
34, 33, 32, 33, 
QVector + QString
5, 
5, 5, 5, 5, 5, 
6, 6, 6, 6, 5, 
5, 6, 6, 5, 5, 
5, 6, 6, 5, 5, 
5, 6, 5, 5, 5, 
5, 5, 5, 5, 5, 
5, 5, 5, 6, 6, 
5, 5, 5, 5, 5, 
6, 5, 5, 5, 5, 
5, 5, 5, 5, 5, 
5, 5, 6, 6, 5, 
5, 5, 5, 5, 5, 
5, 5, 5, 5, 5, 
5, 5, 5, 5, 5, 
5, 5, 5, 5, 5, 
5, 6, 6, 6, 5, 
5, 5, 5, 5, 5, 
5, 5, 5, 5, 6, 
5, 5, 5, 5, 5, 
6, 5, 5, 6, 

Автор: SABROG 12.3.2010, 01:57
Цитата(rudvil @  11.3.2010,  23:07 Найти цитируемый пост)
так-же, как в stl
Код

typedef std::string::const_iterator iter;
std::string test = "sHello!";
iter beg = test.begin();
iter end = test.end();
++beg;
std::string str(beg, end); // str содержит в себе "Hello!"



Код

    typedef QString::const_iterator qiter;
    QString qtest = "sHello!";
    qiter qbeg = qtest.begin();
    qiter qend = qtest.end();
    ++qbeg;
    QString qstr(qbeg, qend-qbeg);


Автор: rudvil 12.3.2010, 02:02
Цитата(SABROG @ 12.3.2010,  00:57)
Цитата(rudvil @  11.3.2010,  23:07 Найти цитируемый пост)
так-же, как в stl
Код

typedef std::string::const_iterator iter;
std::string test = "sHello!";
iter beg = test.begin();
iter end = test.end();
++beg;
std::string str(beg, end); // str содержит в себе "Hello!"



Код

    typedef QString::const_iterator qiter;
    QString qtest = "sHello!";
    qiter qbeg = qtest.begin();
    qiter qend = qtest.end();
    ++qbeg;
    QString qstr(qbeg, qend-qbeg);

Так я первым делом попробовал, позже выяснилось - что у QString'a попросту нету такого конструктора...

Автор: SABROG 12.3.2010, 02:04
Цитата(rudvil @  12.3.2010,  02:02 Найти цитируемый пост)
Так я первым делом попробовал, позже выяснилось - что у QString'a попросту нету такого конструктора... 

Обрати внимание на второй параметр в последней строчке. Я скомпилировал и проверил код, прежде чем выложить.

Автор: rudvil 12.3.2010, 02:11
Цитата(SABROG @ 12.3.2010,  01:04)
Цитата(rudvil @  12.3.2010,  02:02 Найти цитируемый пост)
Так я первым делом попробовал, позже выяснилось - что у QString'a попросту нету такого конструктора... 

Обрати внимание на второй параметр в последней строчке. Я скомпилировал и проверил код, прежде чем выложить.

Заработало!!! большое спасибо  smile 
Я даже и не обратил на него внимание
Код
QString::QString ( const QChar * unicode, int size )

Теперь все понял, ведь итератор у QString'a это по сути просто массив кчаров, а я  smile ...

Автор: SABROG 12.3.2010, 02:32
Цитата(rudvil @  12.3.2010,  02:11 Найти цитируемый пост)
Теперь все понял, ведь итератор у QString'a это по сути просто массив кчаров, а я  smile ...

Угу. Но это короче:

Код

QString qtest = "sHello!";
qtest.remove(0, 1);


Код

QString qtest = "sHello!";
QString qtest2 = qtest.mid(1);

Автор: rudvil 12.3.2010, 02:41
Цитата(SABROG @ 12.3.2010,  01:32)
Цитата(rudvil @  12.3.2010,  02:11 Найти цитируемый пост)
Теперь все понял, ведь итератор у QString'a это по сути просто массив кчаров, а я  smile ...

Угу. Но это короче:

Код

QString qtest = "sHello!";
qtest.remove(0, 1);


Код

QString qtest = "sHello!";
QString qtest2 = qtest.mid(1);

Спасибо, но как я уже выше писал smile 
Цитата(rudvil)
То был лишь пример, на самом деле позиции итераторов могут быть где угодно, хоть посередине текста.

конечно, можно и с помощью индекса бегать по тексту... но я  всёже предпочитаю итератор)

Автор: andrew_121 12.3.2010, 03:10
rudvil, я на Qt пишу(писал) около шести лет. но для разработки алгоритмов, предпочел бы STL.
искренне не понимаю, чего и кому там не хватает, но в алгоритмах есть абсолютно все!
еще частенько использую: http://www.boost.org/doc/libs/1_42_0/doc/html/string_algo.html

Автор: borisbn 12.3.2010, 05:55
По поводу грязного теста: QString не хранит копииодинаковых строк, а хранит лишь ссылки на них, поэтому и вышло быстрее. Попробуй каждый раз в цикле генерить уникальную строку, например QString::number( i ), и результат должен поменяться. А вот почему QVector быстрее std::vector - ???

Автор: andrew_121 12.3.2010, 06:06
Цитата(borisbn @  12.3.2010,  05:55 Найти цитируемый пост)
А вот почему QVector быстрее std::vector - ??

потому что QVector хранит указатели на элементы. в то время как std::vector сами элементы.

Автор: borisbn 12.3.2010, 10:53
Цитата(andrew_121 @  12.3.2010,  06:06 Найти цитируемый пост)
QVector хранит указатели на элементы

откуда такие сведения?
я залез в исходники QVector'а, и вот, что увидел:
Код

template <typename T>
struct QVectorTypedData
{
...
    T array[1];
};

inline const T &QVector<T>::at(int i) const
{ 
  return d->array[i];
}

Автор: W4FhLF 12.3.2010, 11:37
Цитата(borisbn @  12.3.2010,  05:55 Найти цитируемый пост)
А вот почему QVector быстрее std::vector - ???


Потому что метод at() у std::vector делает несколько проверов на out of range. Юзать надо operator[]. 

И потому что если тестировать STL на скорость надо перед всеми зедерами писать:

Код

#ifndef _DEBUG
#define _SECURE_SCL 0
#endif


Чтобы убрать лишние check'и

Добавлено через 47 секунд
А так STL не медленнее. 

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