Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.80/15: Рейтинг темы: голосов - 15, средняя оценка - 4.80
0 / 0 / 1
Регистрация: 30.07.2012
Сообщений: 59
1

Двумерный вектор. Не работает reserve()

06.08.2018, 16:19. Показов 3007. Ответов 5
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Пишу динамическую таблицу, элементы и размеры которой задаются из .txt.
Использую двумерный вектор. Но не получается сделать reserve() - size() показывает всегда какие-то непонятные константные значения(непонятно откуда берутся).

Прилагаю код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <string>
#include <vector>
#include <list>
 
 
class ScoresTable {
    std::string tablePath;
    std::string tableConfigurePath;
    int size;
    int columnCount;
 
    std::vector<std::vector<std::string>> table;
    std::vector<std::string> titles;
 
 public:
    ScoresTable();
    void setPath(std::string path);
    void loadScoresTable();
    void configure();
    void parse(std::string row, int rowNum);
};
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
#include <string>
#include <iostream>
#include <fstream>
#include <vector>
#include <list>
#include <sstream>
#include <ncurses.h>
#include <iterator>
 
#include "../src/ScoresTable.h"
 
 
ScoresTable::ScoresTable() {}
 
void ScoresTable::setPath(std::string path) {
    this->tablePath  = path + ".txt";
    this->tableConfigurePath = path + "_configure.txt";
}
 
void ScoresTable::loadScoresTable() {
    configure();
    std::ifstream file(tablePath);
    std::string line;
 
    int rowNum = 0;
    while (getline(file, line)) {
        getline(file, line);
        rowNum++;
        parse(line, rowNum);
    }
    file.close();
}
 
void ScoresTable::configure() {
    std::ifstream file(tableConfigurePath);
    std::string line;
 
    // Getting size
    getline(file, line);
    this->size = std::stoi(line);
    // Getting column count
    getline(file, line);
    this->columnCount = std::stoi(line);
 
//    TODO memory!!!!!!!!!!!!!!!!!!!!!!!
    table.reserve(10);
    for (int i = 0, _size = table.size(); i < _size; i++) {   // Why table.size() working, but this->size not work?
        table[i].reserve(this->columnCount);
    }
 
    // Getting titles
    while (getline(file, line)) {
        titles.push_back(line);
    }
 
    file.close();
}
 
void ScoresTable:: parse(std::string row, int rowNum) {
    std::istringstream iss(text);
    std::vector<std::string> results(std::istream_iterator<std::string>{iss},
                                     std::istream_iterator<std::string>());
    for (int i = 0; i < rowNum; i++) {
//        table.push_back(results);   //          на этом месте программа ломается(я неправильно пушу)  
    }
}
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
06.08.2018, 16:19
Ответы с готовыми решениями:

QVector::reserve() + std::vector::reserve() и добавление в начало
Если зарезервировать в новосозданном векторе место, а затем добавлять объекты классов в начало -...

Теория. Почему в данном случае copy() не работает после reserve(), но работает после resize()?
Есть такая функция: void Array::SetStartIndexes(sz3_Arr_t *array) { ...

Сделайте, чтобы двумерный вектор обогнал двумерный массив при заполнении случайными числами
Всем привет! Попробовал сравнить время заполнения векторов в векторе и массивов в массиве...

Двумерный вектор
Хочу создать в классе Model вектор двумерный указателей на объекты класса Cell. Как можно создать...

5
шКодер самоучка
2227 / 1921 / 927
Регистрация: 09.10.2013
Сообщений: 4,262
Записей в блоге: 7
06.08.2018, 18:05 2
MrMax836, у меня такое ощущение, что вы перепутали resize и reserve
1
0 / 0 / 1
Регистрация: 30.07.2012
Сообщений: 59
06.08.2018, 18:44  [ТС] 3
Цитата Сообщение от Max Dark Посмотреть сообщение
вы перепутали resize и reserve
Возможно.
В заголовочном файле я объявил вектор.
В cpp получаю из файла размеры вектора и инициализирую пустой вектор заданного размера. В дальнейшем заполняю его(что и не получается, так же, как и размер не задаётся).
Я уже пользовался векторами таким образом, только это был вектор векторов типа char. Всё работало. Сейчас же не могу понять в чём проблема.
0
шКодер самоучка
2227 / 1921 / 927
Регистрация: 09.10.2013
Сообщений: 4,262
Записей в блоге: 7
06.08.2018, 21:51 4
Лучший ответ Сообщение было отмечено MrMax836 как решение

Решение

MrMax836, reserve выделяет память, но не меняет размер(количество элементов в векторе).
resize как раз меняет размер и при необходимости перераспределяет память.

Судя по коду в 46й строке нужен как раз resize, а не reserve

Добавлено через 2 часа 52 минуты
Из "странного" в коде:
строки 26-27: 2 раза подряд getline(file, line). Смысл?
строки 46-49: можно заменить одной table.reserve(size);, так как цикл выполнится ровно 0 раз.
метод parse: зачем вставлять в таблицу одну и туже строку rowNum раз?
1
0 / 0 / 1
Регистрация: 30.07.2012
Сообщений: 59
07.08.2018, 09:28  [ТС] 5
Цитата Сообщение от Max Dark Посмотреть сообщение
resize как раз меняет размер и при необходимости перераспределяет память
Спасибо, помогло!
Цитата Сообщение от Max Dark Посмотреть сообщение
строки 26-27: 2 раза подряд getline(file, line). Смысл?
В файле 1 строка - размер, вторая строка - кол-во колонок(размер внутреннего вектора).
Это можно как-то по-другому записать?

Цитата Сообщение от Max Dark Посмотреть сообщение
строки 46-49: можно заменить одной table.reserve(size);, так как цикл выполнится ровно 0 раз.
А почему 0 раз? Если он должен(ну, в моей задумке) выполниться столько раз, сколько указано в файле конфигурации.
Цитата Сообщение от Max Dark Посмотреть сообщение
метод parse: зачем вставлять в таблицу одну и туже строку rowNum раз?
Да, тут действительно косяк, сам бы позже заметил, спасибо.
Просто пробовал различные методы сплита

Добавлено через 58 минут
Цитата Сообщение от MrMax836 Посмотреть сообщение
строки 26-27: 2 раза подряд getline(file, line). Смысл?
В файле 1 строка - размер, вторая строка - кол-во колонок(размер внутреннего вектора).
Это можно как-то по-другому записать?

Это была опечатка!
Даже когда указали, не сразу заметил, спасибо!
0
шКодер самоучка
2227 / 1921 / 927
Регистрация: 09.10.2013
Сообщений: 4,262
Записей в блоге: 7
07.08.2018, 09:33 6
Цитата Сообщение от MrMax836 Посмотреть сообщение
А почему 0 раз?
потому что после table.reserve(size) размер не изменится и table.size() == 0
1
07.08.2018, 09:33
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
07.08.2018, 09:33
Помогаю со студенческими работами здесь

Двумерный вектор, ошибка
Здраствуйте! Почему я так не могу определить размер двумерного вектора? Подчеркивает красным 2...

Двумерный вектор в классе
Qt, необходимо создать класс в который поместить двумерный вектор типа double, размеры массива...

Запись в двумерный вектор
Есть файл input.txt со следующим содержимым: 0 1 0 0 0 1 0 1 1 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0...

Двумерный вектор: запись по индексу
Привет, подскажите пожалуйста, можно ли создать двумерный вектор, задать размер к примеру 250х250...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru