© EVILEG 2015-2018
Рекомендует хостинг
TIMEWEB
13 ноября 2017 г. 10:35

QVector c неуказанным количеством элементов

QVector

При такой записи все данные записываются в [0] элемент вектора. Как Записывать все не в один, а в разные элементы?

 QVector<double>*Open1= new QVector<double>;    Open1->append(18); Open1->append(20); Open1->append(23); qDebug() <<  Open1[0];
  • #
  • 13 ноября 2017 г. 10:57

Что значит в разные?
Если вы хотите по порядку закидывать в вектор то лучше юзать push_back хотя и append работает.
Попробуйте этот код, у вас должно работать

    QVector<double> *Open1= new QVector<double>;
    Open1->push_back(2.5);
    Open1->push_back(4.6);
    Open1->append(5.3);

    for (int i = 0; i <= Open1->size(); ++i)
    {
        std::cout << Open1->at(i) << std::endl;
    }

Тоже в 0 ячейку записывает.

Скажите пожалуйста, std::vector вычисляются быстрее, нежели QVector?

Что за....

Если вы в куче выделяете память через new, то следующее даже работать не будет как требуется
qDebug() <<  Open1[0];
Я уже говорил вам, что если память выделена в куче, то нужно использовать метод at()
qDebug() <<  Open1->at(0);
Далее, если Вам не нравится, что запись ведётся в ячейку 0, то Вам придётся с этим смириться , поскольку ни одному опытному программисту не понравится, когда он увидит, что под индексом 0 находится мусор, потому, что вам не нравится считать с 0.
При такой записи все данные записываются в [0] элемент вектора
Может перефразируете? при таком способе записи информации в 0 элемент добавляется только первый добавленный элемент, а остальные добавляются по порядку.
 
В общем вы делаете проблему на пустом месте. Никто так не пишет, как вы хотите.

Так вы не хотите писать в 0 ячейку? Это что то странное. Если вы запишите в 1 ячейку то что у вас будет в 0 ячейке?
Вот подумайте и скажите.

Я думал писать по очереди, сначала в 0, затем в 1, затем в 2

append или push_back так и делают. пишут по порядку.
Понятия не имею, что вы творите в своём коде, что у вас всё пишется в 0-й элемент.

посмотрите пример что я вам привел. Я добавляю элементы через push_back. Вы собрали его? Вы посмотрели вывод в консоли?
Видите что вам вывелось? Все элементы по порядку как и были добавленны. Это о чем говорит? О том что push_back добавлял с начала в 0 потом в 1 ячейку.

Я написал также , как  и вы. Очень странно выходит. Вот скрин, я не вру.

У тебя там в коде Out of Range. Сам тоже скомпилируй что написал в Debug сборке. Проверку на выход за размер вектора в цикле неправильно написал.

А вы всё-таки приложите скриншот.

Извиняюсь, не приложился сразу

А правда, что при работе с большими объёмами памяти  QVector пораждает баги?

  • Миша
  • #
  • отредактировано 13 ноября 2017 г. 11:52
  • 13 ноября 2017 г. 11:52

При кривых руках баги пораждаются чаще.


Всё правильно он вам выводит... память выделена в куче. с оператором [0] будет указатель на объект QVector, который выведет всю информацию о вектора и всех его трёх элементах... А не конкретно на первый элемент QVector.

Сколько раз мне ещё повторить вам, чтобы до вас дошло, что если выделяете память в куче, то доступ к элементам надо делать через метод at()?

QVector<double>*Open1= new QVector<double>;   
Open1->append(18); 
Open1->append(20); 
Open1->append(23); 

qDebug() <<  Open1->at(0);
  • Миша
  • #
  • отредактировано 13 ноября 2017 г. 11:55
  • 13 ноября 2017 г. 11:54

И вообще... без особой надобности никто не выделяет память через метод new для QVector или std::vector

0 в вашем случаи это начало вектора которое содержит все элементы.
Вам же выше написали, чтоыб получить инфу по конкретному элементу надо через at() делать.

Да, так заработало. Спасибо.

А вы при больших объемах данных работаете с std::vector или QVector?

Работаю. Проблем не наблюдается. Максимум вопросы производительности при сложных алгоритмах, но это извечная проблема любой разработки и любых контейнеров.

По факту это одно и тоже.
разница в том что QVector это вектор переработанный для совместимости с другими отьектами и методами Qt.
Он имеет почти теже самые методы что и стандартный вектор std::vector
Если пишите проект на Qt то используете свой вектор.
Если пишите например консольное приложение без использования Qt то юзаете стандартный.

спасибо

Ответы

Только авторизованные пользователи могут отвечать на форуме.
Пожалуйста, Авторизуйтесь или Зарегистрируйтесь
15 июня 2018 г. 12:42
Nicky

C++ - Тест 004. Указатели, Массивы и Циклы

  • Результат 100 баллов
  • Очки рейтинга 10
15 июня 2018 г. 12:36
Nicky

C++ - Тест 003. Условия и циклы

  • Результат 57 баллов
  • Очки рейтинга -2
15 июня 2018 г. 12:29
Nicky

C++ - Тест 001. Первая программа и типы данных

  • Результат 46 баллов
  • Очки рейтинга -6
Последние комментарии
18 июня 2018 г. 7:12
EVILEG

PyQt5 - Урок 007. Работаем с QML QtQuick (Сигналы и слоты)

Я вот сейчас банальность скажу, но у меня всё работало. Так что даже и не знаю, надо на код смотреть, что ещё у вас добавлено или отсутствует из библиотек. P/S/ Извините, вы сейчас вс...
18 июня 2018 г. 7:10
EVILEG

Qt/C++ - Урок 042. PopUp уведомление в стиле Gnome с помощью Qt

Недоработки, вряд ли этот зверь вообще является официально поддерживаемым
18 июня 2018 г. 7:01
EVILEG

QML - Урок 016. База данных SQLite и работа с ней в QML Qt

что-то мне сдаётся, что здесь просто пересобрать проект нужно с удалением build каталога
18 июня 2018 г. 7:00
EVILEG

Qt - WinAPI. Как показать запущенное приложение поверх своего приложения

Если зарыться в API системы, то, думаю, что можно, тут тоже использовался WinAPI.
16 июня 2018 г. 15:19
pro100belik

Qt - WinAPI. Как показать запущенное приложение поверх своего приложения

А можно по ID процесса  выводить на передний план окно? myProcess->processId();
Сейчас обсуждают на форуме
19 июня 2018 г. 7:56
EVILEG

как редактировать порядок обхода этементов по нажатию TAB в Qt5 qml

Что-то наподобие такого TextField { Keys.onReturnPressed: nextItemInFocusChain().forceActiveFocus()}
19 июня 2018 г. 6:31
kabanov

Как сохранить фокус в TextField после перезагрузки модели

Rectangle { ListView { id: listView delegate: Item { id: cDelegate Item { Row { ComboBox { ...
18 июня 2018 г. 10:51
alex_lip

Qml and JavaScript

В том то и дело что просто в JS так нельзя Если использовать state - onReleased - не нужен вот так все работает Text { ...
18 июня 2018 г. 7:16
EVILEG

почему не выполняется код после вызова слота?

в рамках какого кода, из вашего вопроса не понятно, к чему вы задали этот вопрос и к чему это относится. Если мне ещё ясно, к какой статье этот вопрос был задан, поскольку я слежу за всем ре...

Рекомендуемые страницы