Форум программистов, компьютерный форум CyberForum.ru

Нужен динамический контейнер, который будет соединять разные переменные, разных типов в блоки - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ с C++ Builder6 в devcpp-4.9.9.2 http://www.cyberforum.ru/cpp/thread1061039.html
Добрый день! Появился не большой вопрос. Есть ли возможность с C++ Builder6 в devcpp-4.9.9.2 сделать ? Чтобы все было красиво и компилировалась. Есди да, подскажите каким образом. Спасибо за ответ
C++ Как узнать размер файла Вобщем программа -кодировщик методом Хаффмана, взята из интернета. Нужно добавить к ней вывод размера входного файла и сжатого.. Перерыла весь гугл, испробывала все методы, никак не могу вывести размер файлов... Вот часть кода, где должен вычисляться размер . По логике он уже вычисляется. Но не выводит на экран. Пробывала раааазличными способами..... void Encoder::Work(char *in_name,char... http://www.cyberforum.ru/cpp/thread1060583.html
C++ Замена символов в фвйлах
Здравствуйте, столкнулся с проблемой. Есть 2100 файлов, в них произвел несовсем корректную замену. Всвязи с этим возникла сладующая ситуация: Есть папка, в которой находится очень много файлов, в том числе и те, что мне нужны с расширением .js. Мне необходимо проверить условие: в файле первые 2 символа "*/" и если так оно и есть, то удалить их или заменить пробелом. Речь идет именно о первых...
C++ Нужен совет:
я учусь в 2-ом курсе на программиста у меня есть базовые знание c++,STL до сих пор работал только с консолью,опыта нету что дальше сделать?? перейти на java?? или изучать qt??
C++ Переменное кол-во членов в структуре. Возможно ли? http://www.cyberforum.ru/cpp/thread1057631.html
Суть задачи - создать "хранилище данных", которое может изменять как свои члены ( по типу, например была 1-ая колонка char типов, а стало нужно int, при этом удалить старые ), так и размер членов ( например длину char массива ). Как я понимаю структура не может дать мне желанной динамики, если так, то вопрос о реализации с помощью других способов. Например как мне видится, использовать...
C++ Компилятор на x64 разрядную систему Здравствуйте! Нужен нормальный борланд под 64 разрядную систему, а то я в инете скачивал, но они все запускаются, но не вижут библиотек! подробнее

Показать сообщение отдельно
silent_1991
Эксперт C++
4949 / 3025 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
13.01.2014, 06:55     Нужен динамический контейнер, который будет соединять разные переменные, разных типов в блоки
Цитата Сообщение от Izual Посмотреть сообщение
Если вектор может дать нужные мне возможности, то если есть кусочек кода что ли с примером обращения к таким членам и их использовании в конвертировании, я был бы рад его увидеть - для наглядности.
Вектор может дать вам только те же возможности, что и стандартные массивы плюс такие дополнительные вещи, как динамическое расширение размера, получение текущего размера, ну и множество дополнительных полезных методов, о которых можно почитать в документации по стандартной библиотеке. Сам вектор строго типизированный, он не позволит сам по себе выбирать тип элемента, это надо писать самостоятельно либо пользоваться уже упомянутыми мною boost::any/boost::variant.
Вот пример работы с вектором (заполнение и вывод на экран двумерной матрицы с динамическим добавлением элементов в вектор)
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
#include <iostream>
#include <vector>
#include <cstdlib>
#include <ctime>
 
// Вспомогательная функция, возвращает случайное число в промежутке [lower, upper)
int get_random_value(int lower, int upper)
{
    return static_cast<int>(lower + (upper - lower) * static_cast<double>(std::rand()) / RAND_MAX);
}
 
int main() {
    // Инициализация генератора случайных чисел
    std::srand(static_cast<unsigned>(std::time(0)));
    
    // Создаём матрицу. Пока она пустая, размера 0x0
    std::vector<std::vector<int> > matrix;
    int rows, cols;
    
    // Генерируем случайный размер матрицы
    rows = get_random_value(2, 7);
    cols = get_random_value(2, 7);
    
    // Заполняем матрицу
    for (int i = 0; i < rows; ++i) {
        // Создаём пустую строку матрицы
        std::vector<int> row;
        // Заполняем строку
        for (int j = 0; j < cols; ++j) {
            // С помощью метода push_back помещаем очередной элемент в конец строки
            // Расширение размера строки происходит автоматически
            row.push_back(get_random_value(-10, 10));
        }
        
        // Помещаем строку в конец матрицы
        // Расширение количества строк также происходит динамически
        matrix.push_back(row);
    }
    
    // Выводим сгенерированную матрицу
    // Метод size() возвращает количество элементов в векторе, т.е. в данном
    // случае по сути количество строк матрицы
    for (int i = 0; i < matrix.size(); ++i) {
        // Выводим очередную строку. Метод size вернёт размер строки
        for (int j = 0; j < matrix[i].size(); ++j) {
            // Индексируем матрицу. В данном случае оператор matrix[i] возвращает
            // ссылку на i-ую строку матрицы, к которой мы также применяем
            // оператор индексации для получение ссылки на j-й элемент строки
            std::cout << matrix[i][j] << "\t";
        }
        
        std::cout << std::endl;
    }
    
    return 0;
}
Я специально написал код, который добавляет все элементы динамически. На самом деле в данном случае правильнее было бы выделить всю матрицу сразу вот так:
C++
1
2
int rows = get_random_value(2, 7), cols = get_random_value(2, 7);
std::vector<std::vector<int> > matrix(rows, std::vector<int>(cols, 0));
Здесь используется форма конструктора, принимающего количество элементов и инициализирующий элемент. Для вектора первого уровня количество элементов соответствует количеству строк, а инициализирующим элементом является строка - вектор размером cols с инициализирующим элементом 0.
В этом случае для такой матрицы уже не нужно использовать оператор push_bakc (вся нужная память уже выделена), а работать с ней необходимо сразу через индексацию. Вывод не будет отличаться от приведённого в коде выше, а вот заполнение уже нужно выполнять так:
C++
1
2
3
4
5
for (int i = 0; i < matrix.size(); ++i) {
    for (int j = 0; j < matrix[i].size(); ++j) {
        matrix[i][j] = get_random_value(-10, 10);
    }
}
Также стандартные векторы (как и любые стандартные контейнеры) поддерживают итераторы, с помощью которых удобно и, что главное, переносимо (т.е. независимо от фактического типа контейнера) перемещаться по контейнеру.
Векторы позволят вам решить эту проблему:
Цитата Сообщение от Izual Посмотреть сообщение
Получится что структура будет забирать больше памяти чем нужно...
 
Текущее время: 11:16. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru