Поиск:

Ответ в темуСоздание новой темы Создание опроса
> STL, считывание данных 
:(
    Опции темы
Aurus
Дата 13.6.2012, 05:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 34
Регистрация: 14.8.2005
Где: Новосибирск

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



Всем привет.

Есть файл со значениями x,y для вывода зачений в программе и построения графика:

1.567,4.876
3.567,-1.765
0.987,1.004
......
Считываю сначала первую колонку значений в
List<float> x; 
затем вторую в 
List<float> y;

Весь файл я считываю в QString, приходиться преобразовывать тип QString в float, читал что преобразование типов - это сигнал что в программе что-то делается не так. Можно ли в моём случае избежать преобразования типов?

Приходится вручную указывать количество колонок для построения таблицы дл вывода значений x,y в виджете. В перспективе будет ещё координата z. Вот думаю что лучше использоваать двух,трёх-мерный QList или Map?

В Qt есть возможность использовать итераторы в стиле Java и STL, какие предпочтительнее?
PM MAIL ICQ   Вверх
math64
Дата 13.6.2012, 07:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Лучше считывать сразу обе координаты например в QList<QPointF>.
Преобразования из строки (не обязательно QString) в число не избежать - ведь числа хранятся в файле в виде строк.
Какой тип итераторов будешь использовать - безразлично. Я предпочитаю использовать foreach - так писать меньше, хотя код генерится не оптимальный.

Добавлено через 4 минуты
При появлении координаты z класс QPointF нужно будет заменить на свой, позволяющий хранить три координаты или если нужно, более.
PM   Вверх
Amp
Дата 13.6.2012, 07:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Еще необходимо проследить за локалью, иначе конвертация строки в число может закончиться неприятным сюрпризом.
PM MAIL   Вверх
borisbn
Дата 13.6.2012, 15:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(Aurus @  13.6.2012,  05:58 Найти цитируемый пост)
 читал что преобразование типов - это сигнал что в программе что-то делается не так

не так категорично... Представь, что некий датчик даёт тебе пройденное расстояние в метрах. В целых. Т.е. с точночтью до метра. Тебе нужно вычислить скорость. Ты вычисляешь время с точностью до секунды (предположим больше не нужно), а затем делишь целое число метров на целое число секунд. Результат не обязан быть целым.
А то, что ты читал, это, скорее всего, когда указатель одного типа преобразуется в указатель другого (это совершенно не относится к указателю на наследника и указателю на бозовый типы). В этом случае - да, что-то неладное с программой.

Цитата(Aurus @  13.6.2012,  05:58 Найти цитируемый пост)
В перспективе будет ещё координата z. Вот думаю что лучше использоваать двух,трёх-мерный QList или Map?

Лучше всего создать свою структуру. Типа такого
Код

struct MyPoint {
    float x;
    float y;
    float z;
    MyPoint() : x( -1 ), y( -1 ), z( -1 ) {}
};

bool str_2_point( const QString & str, MyPoint & point ) {
    bool res = false;
    QStringList parts = str.split( "," );
    if ( parts.size() >= 2 ) {
        point.x = parts.at( 0 ).toFloat( &res );
        if ( res ) {
            point.y = parts.at( 1 ).toFloat( &res );
        }
        if ( res && parts.size() > 2 ) {
            point.z = parts.at( 2 ).toFloat( &res );
        }
    }
    return res;
}

В этом случае при добавлении в файл третьего измерения в твоём коде будет минимум изменений (во всяком случае в функции str_2_point - вообще не будет)

Добавлено через 4 минуты и 48 секунд
Цитата(Aurus @  13.6.2012,  05:58 Найти цитируемый пост)
В Qt есть возможность использовать итераторы в стиле Java и STL, какие предпочтительнее? 

Я бы посоветовал в Си++ (к коему Qt относится) использовать STL-итераторы - их можно отдавать в стандартные алгоритмы. Я думаю, Java-итераторы введены для тех, кто раньше много писал на Java и ооооочень привык к ним.


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


одинокий падаван
**


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

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



Цитата(borisbn @  13.6.2012,  13:05 Найти цитируемый пост)
Я бы посоветовал в Си++ (к коему Qt относится) использовать STL-итераторы - их можно отдавать в стандартные алгоритмы. Я думаю, Java-итераторы введены для тех, кто раньше много писал на Java и ооооочень привык к ним. 


Был у меня случай, когда использовать STL итератор не получилось, но Java итератор отработал на ура.
Код

    template<class TKey,class TValue> void safeClearMapOfPointers(QMap<TKey,TValue*>&map)
    {
        QMutableMapIterator<TKey,TValue*> iter(map);
        while(iter.hasNext())
        {
            iter.next();
            delete iter.value();
            iter.remove();
        }
    }


Первоначальный вариант был на stl итераторах, но он не скомпилился - подробностей не помню =)

Это сообщение отредактировал(а) _GRIN_ - 13.6.2012, 15:39


--------------------
Дорогу осилит идущий
PM MAIL Skype   Вверх
boostcoder
Дата 13.6.2012, 15:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


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

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



_GRIN_, чтоб не пришлось городить _лечение_последствий_ вроде приведенного, в контейнерах нужно хранить смарты smile 
PM WWW   Вверх
_GRIN_
Дата 13.6.2012, 16:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


одинокий падаван
**


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

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



boostcoder, полностью с тобой согласен (насчёт смартов) =)
Но суть не в том, что хранится в контейнере, а в том, что в том случае у меня не получилось использовать stl итераторы, и прошлось java итераторы заюзать.


--------------------
Дорогу осилит идущий
PM MAIL Skype   Вверх
boostcoder
Дата 13.6.2012, 16:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


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

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



ну я и говорю - _лечение_последствий_

PM WWW   Вверх
borisbn
Дата 13.6.2012, 16:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



_GRIN_, ты, наверное, пытался работать с итератором QMap как с итератором std::map, а они отличаются
Цитата
For QMap and QHash, the * operator returns the value component of an item.

Твоя функция для STL-итератора в QMap'е д.б. выглядеть так:
Код

template<class TKey,class TValue> void safeClearMapOfPointers(QMap<TKey,TValue*>&map)
{
    QMap<TKey,TValue*>::iterator it = map.begin();
    QMap<TKey,TValue*>::iterator end = map.end();
    while ( it != end ) {
        // delete (*it).second;  // вот так (по STL-ному) не работает, т.к. у QMap::iterator нет second
        delete (*it);  // так работает
       //delete it.value(); // так тоже работает
        it = map.erase( it );
    }
}


Добавлено через 3 минуты и 7 секунд
А вообще-то да... если хранить QSharedPointer, например, то функция выглядела бы так
Код
map.clear();

 smile 


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


одинокий падаван
**


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

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



=) шутники:

Код

#include <QMap>
#include <QDebug>

template<class TKey,class TValue> void safeClearMapOfPointers(QMap<TKey,TValue*>&map)
{
//    QMutableMapIterator<TKey,TValue*> iter(map);
//    while(iter.hasNext())
//    {
//        iter.next();
//        delete iter.value();
//        iter.remove();
//    }
    QMap<TKey,TValue*>::iterator it = map.begin();
    QMap<TKey,TValue*>::iterator end = map.end();
    while ( it != end ) {
        // delete (*it).second;  // вот так (по STL-ному) не работает, т.к. у QMap::iterator нет second
        delete (*it);  // так работает
       //delete it.value(); // так тоже работает
        it = map.erase( it );
    }
}

class TestClass
{
    int m_id;
public:
    TestClass(const int id) : m_id(id) {}
    ~TestClass() { qDebug() << m_id << " was deleted"; }
};

int main()
{
    QMap<int,TestClass*>map;
    for(int i = 0; i < 3; i++)
    {
        map.insert(i, new TestClass(i));
    }

    safeClearMapOfPointers<int, TestClass>( map );

    return 0;
}


лог сборки:
Код

18:31:05: Running steps for project tst_clear_map_through_mapiterator...
18:31:05: Configuration unchanged, skipping qmake step.
18:31:05: Starting: "/usr/bin/make" -w
make: Entering directory `/home/grin/1_work/research/qt/tst_clear_map_through_mapiterator'
g++ -c -pipe -O2 -Wall -W -D_REENTRANT -DQT_NO_DEBUG -DQT_CORE_LIB
 -DQT_SHARED -I../../../../3_soft/qtsdk-2010.03/qt/mkspecs/linux-g++ -I. -I../../../../3_soft/qtsdk-
2010.03/qt/include/QtCore -I../../../../3_soft/qtsdk-2010.03/qt/include -I. -o main.o main.cpp
main.cpp: In function 'void safeClearMapOfPointers(QMap<TKey, TValue*>&)':
main.cpp:14: error: expected ';' before 'it'
main.cpp:15: error: expected ';' before 'end'
main.cpp:16: error: 'it' was not declared in this scope
main.cpp:16: error: 'end' was not declared in this scope
main.cpp: In function 'void safeClearMapOfPointers(QMap<TKey, TValue*>&) [with TKey = int, TValue = TestClass]':
main.cpp:41:   instantiated from here
main.cpp:14: error: dependent-name 'QMap::iterator' is parsed as a non-type, but instantiation yields a type
main.cpp:14: note: say 'typename QMap::iterator' if a type is meant
main.cpp:15: error: dependent-name 'QMap::iterator' is parsed as a non-type, but instantiation yields a type
main.cpp:15: note: say 'typename QMap::iterator' if a type is meant
make: *** [main.o] Error 1
make: Leaving directory `/home/grin/1_work/research/qt/tst_clear_map_through_mapiterator'
18:31:05: The process "/usr/bin/make" exited with code 2.
Error while building/deploying project tst_clear_map_through_mapiterator (target: Desktop)
When executing step 'Make'


теперь мой вариант:
Код

#include <QMap>
#include <QDebug>

template<class TKey,class TValue> void safeClearMapOfPointers(QMap<TKey,TValue*>&map)
{
    QMutableMapIterator<TKey,TValue*> iter(map);
    while(iter.hasNext())
    {
        iter.next();
        delete iter.value();
        iter.remove();
    }
//    QMap<TKey,TValue*>::iterator it = map.begin();
//    QMap<TKey,TValue*>::iterator end = map.end();
//    while ( it != end ) {
//        // delete (*it).second;  // вот так (по STL-ному) не работает, т.к. у QMap::iterator нет second
//        delete (*it);  // так работает
//       //delete it.value(); // так тоже работает
//        it = map.erase( it );
//    }
}

class TestClass
{
    int m_id;
public:
    TestClass(const int id) : m_id(id) {}
    ~TestClass() { qDebug() << m_id << " was deleted"; }
};

int main()
{
    QMap<int,TestClass*>map;
    for(int i = 0; i < 3; i++)
    {
        map.insert(i, new TestClass(i));
    }

    safeClearMapOfPointers<int, TestClass>( map );

    return 0;
}


лог сборки:
Код

18:33:35: Running steps for project tst_clear_map_through_mapiterator...
18:33:35: Configuration unchanged, skipping qmake step.
18:33:35: Starting: "/usr/bin/make" -w
make: Entering directory `/home/grin/1_work/research/qt/tst_clear_map_through_mapiterator'
g++ -c -pipe -O2 -Wall -W -D_REENTRANT -DQT_NO_DEBUG -DQT_CORE_LIB
 -DQT_SHARED -I../../../../3_soft/qtsdk-2010.03/qt/mkspecs/linux-g++ -I. -I../../../../3_soft/qtsdk-
010.03/qt/include/QtCore -I../../../../3_soft/qtsdk-2010.03/qt/include -I. -o main.o main.cpp
g++ -Wl,-O1 -Wl,-rpath,/home/grin/3_soft/qtsdk-2010.03/qt/lib -o tst_clear_map_through_mapiterator main.o
    -L/home/grin/3_soft/qtsdk-2010.03/qt/lib -lQtCore -L/home/grin/3_soft/qtsdk-
2010.03/qt/lib -lpthread 
make: Leaving directory `/home/grin/1_work/research/qt/tst_clear_map_through_mapiterator'
18:33:36: The process "/usr/bin/make" exited normally.


лог выполнения:
Код

Starting /home/grin/1_work/research/qt/tst_clear_map_through_mapiterator/tst_clear_map_through_mapiterator...
0  was deleted 
1  was deleted 
2  was deleted 
/home/grin/1_work/research/qt/tst_clear_map_through_mapiterator/tst_clear_map_through_mapiterator exited with code 0


P.S. Про смарты (QSharedPointer как смарт) я уже писал что согласен =) просто не всегда есть возможность перелопатить весь код (особенно когда работаешь в команде на большим проектом с жёсткими дедлайнами и каждая измененённая строка это головная боль).

Это сообщение отредактировал(а) _GRIN_ - 13.6.2012, 17:38


--------------------
Дорогу осилит идущий
PM MAIL Skype   Вверх
boostcoder
Дата 13.6.2012, 17:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


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

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



Код

typename QMap<TKey,TValue*>::iterator it = map.begin();
typename QMap<TKey,TValue*>::iterator end = map.end();


PM WWW   Вверх
_GRIN_
Дата 13.6.2012, 17:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


одинокий падаван
**


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

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



boostcoder, ага, с typename stl вариант работает.


--------------------
Дорогу осилит идущий
PM MAIL Skype   Вверх
boostcoder
Дата 13.6.2012, 17:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


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

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



_GRIN_, это азы.
вот ты мне честно скажи, это кутя тебе позволила не учить принцип вывода типов в с++?

PM WWW   Вверх
_GRIN_
Дата 13.6.2012, 17:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


одинокий падаван
**


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

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



boostcoder, я за 7 лет практики ни разу не использовал typename (на кьюте я с 2008-го) =).


--------------------
Дорогу осилит идущий
PM MAIL Skype   Вверх
boostcoder
Дата 13.6.2012, 18:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


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

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



аааа...
наверное шаблоны и стандартные контейнеры не используешь. хотя я хз, что/как можно писать не используя STL smile 

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

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

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


 




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


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

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