Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Tiva
94 / 94 / 1
Регистрация: 25.04.2012
Сообщений: 429
#1

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

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

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

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

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

в общем как удобнее всего реализовать это?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.10.2012, 18:09
Здравствуйте! Я подобрал для вас темы с ответами на вопрос динамическая матрица (C++):

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

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

динамическая матрица в си++ - C++
Ребят, задача такова Дана квадратная матрица A(N,N). Получить из неё массив B, если N - четно, и B, если N - нечетно, элементами...

Динамическая матрица - C++
Привет всем. Подскажите пожалуйста, как создать динамическую матрицу размерностью, которая считывается с клавиатуры и присвоить всем...

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

У меня динамическая матрица ? - C++
#include <iostream> using namespace std; int main() { int n,i,j; float a; cout <<"vv n"; cin >> n; for...

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

Собственно, если вам предстоит усиленно работать именно со столбцами, то читайте написанное выше, заменяя слова "строка" на "столбец"
1
Tiva
94 / 94 / 1
Регистрация: 25.04.2012
Сообщений: 429
19.10.2012, 18:59  [ТС] #5
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.
565 / 548 / 5
Регистрация: 16.12.2011
Сообщений: 1,389
19.10.2012, 19:03 #6
C++
1
2
3
4
matr.push_back(std::vector<int>(2)); 
   
std::vector<int> new_row(7);   
matr.push_back(new_row);
1
Tiva
94 / 94 / 1
Регистрация: 25.04.2012
Сообщений: 429
19.10.2012, 19:39  [ТС] #7
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;
    }
}
результат
Код
Matrix:
0

0
0

1
2
3       4       5       6       7
Для продолжения нажмите любую клавишу . . .
мне надо чтоб получилось так:

Код
1   2   3    4  5   6  7
8   9   10  11  12  13  14
15  16  17   18  19  20  21
т.е. чтоб не было "пустых" ячеек, не существующих. как так добавить?
0
I.M.
565 / 548 / 5
Регистрация: 16.12.2011
Сообщений: 1,389
20.10.2012, 00:47 #8
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
20.10.2012, 00:47
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.10.2012, 00:47
Привет! Вот еще темы с ответами:

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

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

Динамическая матрица. вставка столбца - C++
не получается вставка. задание таково, что после столбцов, не содержащих отрицательные элементы нужно вставить 2 столбец. вылетаю на строке...

Дана динамическая целочисленная матрица - C++
Записал код программы, но он не работает. Помогите пожалуйста найти ошибки!!!!! Дана динамическая целочисленная матрица. Построить...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru