Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/18: Рейтинг темы: голосов - 18, средняя оценка - 4.50
96 / 96 / 21
Регистрация: 25.04.2012
Сообщений: 449

динамическая матрица

19.10.2012, 18:09. Показов 3646. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
в общем, надо сделать матрицу доступа, её размер в исходном состоянии 1х1, и потом увечивается, т.е. размер постоянно меняется, как добавлениями, так и удалениями то столбцов, то строк, и частое редактирование ячеек, копирование строк в новую строку и т.д.

что удобнее всего для этого использовать:
обычный двумерный массив (но я не знаю как быть с перераспределениями памяти блин)?
контейнеры? двумерный массив через векторы? а как в векторах сделать двумерные массивы(с одномерными более менее дружу)
или список list? чем он отличается от векторов?

еще увидел в бусте контейнер matrix?

в общем как удобнее всего реализовать это?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
19.10.2012, 18:09
Ответы с готовыми решениями:

Динамическая матрица
Добрый день, у меня такая проблема. Даны 3 матрицы 4х4, 5х5, 7х7. Надо написать одну общую функцию для этих матриц и вызывать ее в main. Я...

Динамическая матрица
Здравствуйте, помогите найти ошибку в динамической матрице: у меня почему-то вызывается автоматически деструктор в программе, хотя мне это...

Динамическая матрица С++
Напишите программу, которая принимает с клавиатуры число N и M, создает матрицу размера N на M, заполненную случайными числами, и выводит...

7
 Аватар для I.M.
576 / 559 / 47
Регистрация: 16.12.2011
Сообщений: 1,389
19.10.2012, 18:17
Цитата Сообщение от Tiva Посмотреть сообщение
а как в векторах сделать двумерные массивы(с одномерными более менее дружу)
C++
1
std::vector<std::vector<int>> matrix;
Добавлено через 1 минуту
Цитата Сообщение от Tiva Посмотреть сообщение
или список list? чем он отличается от векторов?
У вектора быстрый доступ к случайному элементу, но медленное добавление/удаление элемента. И чем ближе к началу вектора, тем медленнее
У листа наоборот
1
96 / 96 / 21
Регистрация: 25.04.2012
Сообщений: 449
19.10.2012, 18:19  [ТС]
а как добавить новый столбец, оставив прежнее кол-во строк?
и как потом брать размерность матрицы по строкам и отдельно по столбцам(когда они разные)
0
 Аватар для I.M.
576 / 559 / 47
Регистрация: 16.12.2011
Сообщений: 1,389
19.10.2012, 18:31
Матрица, созданная даже с помощью контейнеров, все равно остается массивом массивов. А значит удобная работа будет только либо со строками, либо со столбцами. Смотря как вы их называете.
Допустим, что matrix[i] - это строка
тогда длина строки matrix[i].size();
чтобы добавить новую строку в матрицу matrix.push_back(new_row); где new_row - это std::vector<int>

Собственно, если вам предстоит усиленно работать именно со столбцами, то читайте написанное выше, заменяя слова "строка" на "столбец"
1
96 / 96 / 21
Регистрация: 25.04.2012
Сообщений: 449
19.10.2012, 18:59  [ТС]
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <iostream>
#include <vector>
#include <ctime>
#define ROWS 1
#define COLS 1
using namespace std; 
int main()
{
    srand(time(NULL));
    
    vector <vector<int> > matr(ROWS, vector<int>(COLS));
    for ( int i = 0; i < ROWS; ++i )
        for ( int j = 0; j < COLS; ++j )
            matr[i][j] = rand() % 1000;
    
    cout << "Matrix:" << endl;
    for ( vector< vector<int> >::const_iterator i = matr.begin(); i != matr.end(); ++i )
    {
        copy(i->begin(), i->end(), ostream_iterator<int>(cout, "\t"));    
    }
    vector< vector<int>::resize(ROWS+1)>;
}
так не получается... push_back(value) та же самая ошибка
я чего-то не догоняю.
0
 Аватар для I.M.
576 / 559 / 47
Регистрация: 16.12.2011
Сообщений: 1,389
19.10.2012, 19:03
C++
1
2
3
4
matr.push_back(std::vector<int>(2)); 
   
std::vector<int> new_row(7);   
matr.push_back(new_row);
1
96 / 96 / 21
Регистрация: 25.04.2012
Сообщений: 449
19.10.2012, 19:39  [ТС]
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
#include <iostream>
#include <vector>
#include <ctime>
using namespace std;
#define endline cout<<endl
#define ROWS 1
#define COLS 1
using namespace std; 
int main()
{
    int count=0;
    srand(time(NULL));
    
    vector <vector<int> > matr(ROWS, vector<int>(COLS));
    for ( int i = 0; i < ROWS; ++i )
        for ( int j = 0; j < COLS; ++j )
        {
            matr[i][j] = count;
            count++;
        }
    
    cout << "Matrix:" << endl;
    for ( vector< vector<int> >::const_iterator i = matr.begin(); i != matr.end(); ++i )
    {
        copy(i->begin(), i->end(), ostream_iterator<int>(cout, "\t")); 
        cout<<endl;
    }
    endline;
    
    matr.push_back(vector<int>(matr.size())); //тут добавление чего? строки?
    
 
    for ( vector< vector<int> >::const_iterator i = matr.begin(); i != matr.end(); ++i )
    {
        copy(i->begin(), i->end(), ostream_iterator<int>(cout, "\t"));    
        cout<<endl;
    }
    endline;
    
    vector<int> new_row(5);   
    matr.push_back(new_row);//добавление чего? столбцов?
 
//==
    for ( int i = 0; i < matr.size(); ++i )
        for ( int j = 0; j < matr[i].size(); ++j )
        {
            matr[i][j] = count;
            count++;
        }
//==
 
 
    for ( vector< vector<int> >::const_iterator i = matr.begin(); i != matr.end(); ++i )
    {
        copy(i->begin(), i->end(), ostream_iterator<int>(cout, "\t"));    
        cout<<endl;
    }
}
результат
Code
1
2
3
4
5
6
7
8
9
10
Matrix:
0
 
0
0
 
1
2
3       4       5       6       7
Для продолжения нажмите любую клавишу . . .
мне надо чтоб получилось так:

Code
1
2
3
1   2   3    4  5   6  7
8   9   10  11  12  13  14
15  16  17   18  19  20  21
т.е. чтоб не было "пустых" ячеек, не существующих. как так добавить?
0
 Аватар для I.M.
576 / 559 / 47
Регистрация: 16.12.2011
Сообщений: 1,389
20.10.2012, 00:47
Tiva, код, приведенный вами выше работает абсолютно верно.
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
#include <iostream>
#include <vector>
#include <ctime>
using namespace std;
#define endline cout<<endl
#define ROWS 1
#define COLS 1
using namespace std; 
int main()
{
    int count=0;
    srand(time(NULL));
    
    vector <vector<int> > matr(ROWS, vector<int>(COLS));//тут вы создаете матрица 1х1. т.е. всего из одного элемента
    for ( int i = 0; i < ROWS; ++i )
        for ( int j = 0; j < COLS; ++j )
        {
            matr[i][j] = count;//тут вы зануляете этот единственный элемент
            count++;
        }
    
    cout << "Matrix:" << endl;
    for ( vector< vector<int> >::const_iterator i = matr.begin(); i != matr.end(); ++i )
    {
        copy(i->begin(), i->end(), ostream_iterator<int>(cout, "\t"));//весь этот цикл выведет только 0 
        cout<<endl;
    }
    endline;
    
    matr.push_back(vector<int>(matr.size())); //добавление строки размером в 1 элемент, т.к. matr.size вернет 1. 
    //Теперь матрица состоит из двух строк, в каждой из которых по одному элементу
    //элемент в только что добавленной строке равен 0 по умолчанию
    
 
    for ( vector< vector<int> >::const_iterator i = matr.begin(); i != matr.end(); ++i )
    {
        copy(i->begin(), i->end(), ostream_iterator<int>(cout, "\t"));//этот цикл соответственно выведет два нуля друг под другом    
        cout<<endl;
    }
    endline;
    
    vector<int> new_row(5);   //создается вектор из пяти нулей
    matr.push_back(new_row);//добавление этого вектора в матрицу в качестве строки
 
//==
    for ( int i = 0; i < matr.size(); ++i )
        for ( int j = 0; j < matr[i].size(); ++j )
        {
            matr[i][j] = count;//теперь count равен 1, соответственно единственный элемент первой строчки также будет равен 1
            count++;
        }
//==
 
 
    for ( vector< vector<int> >::const_iterator i = matr.begin(); i != matr.end(); ++i )
    {
        copy(i->begin(), i->end(), ostream_iterator<int>(cout, "\t"));    
        cout<<endl;
    }
}
Добавлено через 2 минуты
Цитата Сообщение от Tiva Посмотреть сообщение
мне надо чтоб получилось так:
Можно так. Т.е. сразу создаем матрицу 3 на 7. Затем заполняем ее
C++
1
2
3
4
5
6
7
8
9
vector <vector<int> > matr(3, vector<int>(7));
 
int count = 1;
for ( int i = 0; i < matr.size(); ++i )
   for ( int j = 0; j < matr[i].size(); ++j )
   {
      matr[i][j] = count;
      count++;
   }
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
20.10.2012, 00:47
Помогаю со студенческими работами здесь

Динамическая матрица
помогите написать 2 проги 1) 2) по критериям: 1)Динамические массивы обязательны 2)работать через адресную арифметику, -...

Динамическая верхнетреугольная матрица
Нужно задать верхнюю треугольную матрицу размера 3х3. Размер строк задаётся динамически. int *matrix = {new int,new int,new int}; В...

Объясните динамическая матрица
Здравствуйте. Объясните пожалуйста вот эти строчки кода. int **matrix = new int * ; for ( int index = 0; index &lt; n; index++ ) ...

Динамическая матрица ООП
Добрый день, проблема заключается в следующем. Никак не могу разобраться с заданием Задание: Для хранения объектов каждого...

Двумерная динамическая матрица
в общем помогите, надо написать двумерный массив(int) динамическим и пару функций к нему: 1. удаление столбца 2. удаление строки 3....


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru