Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [Qt] Создание QString с помощью 2-х итераторов 
V
    Опции темы
rudvil
Дата 11.3.2010, 23:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 155
Регистрация: 20.11.2009
Где: Latvia/Riga

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



Посоветуйте, как извратиться(в хорошем смысле), чтобы можно было сконструировать 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;
}

--------------------
xor
PM MAIL Skype   Вверх
andrew_121
Дата 11.3.2010, 23:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


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

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



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


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
rudvil
Дата 11.3.2010, 23:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 155
Регистрация: 20.11.2009
Где: Latvia/Riga

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



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

Жалко..., andrew_121 как считаете, есть какие либо приемущества у QT-подобных контейнеров против stl?
Решил раз уж QT так QT...
Я бы и не парился с QString, но у него удобная поддержка уникода, а именно у QChar-isLetter(не только a-zA-Z) и.т.д.
--------------------
xor
PM MAIL Skype   Вверх
borisbn
Дата 12.3.2010, 00:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

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



А почему не так
Код

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

по поводу преимуществ Qt-контейнеров перед stl: расширенный набор функций, например QList::takeFirst(), а не 
Код

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

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

Это сообщение отредактировал(а) borisbn - 12.3.2010, 00:02


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
rudvil
Дата 12.3.2010, 00:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 155
Регистрация: 20.11.2009
Где: Latvia/Riga

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



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

--------------------
xor
PM MAIL Skype   Вверх
SABROG
Дата 12.3.2010, 01:57 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


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

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



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




--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
rudvil
Дата 12.3.2010, 02:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 155
Регистрация: 20.11.2009
Где: Latvia/Riga

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



Цитата(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 попросту нету такого конструктора...
PM MAIL Skype   Вверх
SABROG
Дата 12.3.2010, 02:04 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


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

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



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

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


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
rudvil
Дата 12.3.2010, 02:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 155
Регистрация: 20.11.2009
Где: Latvia/Riga

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



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

Это сообщение отредактировал(а) rudvil - 12.3.2010, 02:11
--------------------
xor
PM MAIL Skype   Вверх
SABROG
Дата 12.3.2010, 02:32 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


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

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



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

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

Код

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


Код

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



--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
rudvil
Дата 12.3.2010, 02:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 155
Регистрация: 20.11.2009
Где: Latvia/Riga

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



Цитата(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)
То был лишь пример, на самом деле позиции итераторов могут быть где угодно, хоть посередине текста.

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

Это сообщение отредактировал(а) rudvil - 12.3.2010, 02:42
--------------------
xor
PM MAIL Skype   Вверх
andrew_121
Дата 12.3.2010, 03:10 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


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

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



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



--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
borisbn
Дата 12.3.2010, 05:55 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

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



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


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
andrew_121
Дата 12.3.2010, 06:06 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


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

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



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

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


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
borisbn
Дата 12.3.2010, 10:53 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

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



Цитата(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];
}



--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
W4FhLF
Дата 12.3.2010, 11:37 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


found myself
****


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

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



Цитата(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 не медленнее. 


--------------------
"Бог умер" © Ницше
"Ницше умер" © Бог
PM ICQ   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets"
JackYF
Любитель
  • В заголовке темы в квадратных скобках обозначьте используемую вами библиотеку, например: [QT],[GTK],[wx].
  • Если вопрос актуален только для некоторой версии библиотеки, либо, если вы пользуетесь не самой последней версией, укажите это. Например: [QT4], [GTK2].
  • Все начинающие изучать Qt - не забудьте зайти сюда.
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • В вопросе укажите полную версию версию библиотеки, а также все дополнительные используемые программные пакеты.
  • Не забывайте пользоваться кнопкой "Код".
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к тематике этого раздела. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема »


 




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


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

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