-40 / 1 / 0
Регистрация: 14.11.2018
Сообщений: 617
1

Как создать двумерную матрицу через vector?

27.11.2019, 13:29. Показов 9698. Ответов 23
Метки с++ (Все метки)

Понадобилась в середине проге создать двумерную матрицу. Чтобы не заботиться об очистке, решил использовать <vector>, но не знаю как создать двумерную
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
27.11.2019, 13:29
Ответы с готовыми решениями:

Из заданного четного числа создать двумерную матрицу
как из заданного числа создать двумерную матрицу если оно четное

Как инициализировать двумерную матрицу натуральными логарифмами?
Всем привет, столкнулся с небольшой проблемой, мне нужно инициализировать матрицу в таком виде: ...

Как передать целочисленную матрицу типа std::vector<std::vector<int> > в функцию?
Здравствуйте. Почитал на форуме, но так и не понял что я делаю не так. Имеется двумерный вектор....

Записать элементы одномерного массива в двумерную матрицу одним циклом
записать элементы из int massive записать все элементы в int array ) одним циклом

23
5675 / 3120 / 1300
Регистрация: 07.02.2019
Сообщений: 7,824
27.11.2019, 13:34 2
Цитата Сообщение от Гуру77777 Посмотреть сообщение
но не знаю как создать двумерную
можно как vector<vector<тип_элементов>>, а можно просто vector<тип_элементов>, а индексация как i*<количество столбцов> + j
0
-40 / 1 / 0
Регистрация: 14.11.2018
Сообщений: 617
27.11.2019, 13:57  [ТС] 3
zayats80888, Типа vector<vector<int>>?
0
5675 / 3120 / 1300
Регистрация: 07.02.2019
Сообщений: 7,824
27.11.2019, 14:00 4
типа да
0
Just Do It!
3425 / 1896 / 623
Регистрация: 23.09.2014
Сообщений: 5,985
Записей в блоге: 1
27.11.2019, 14:15 5
Цитата Сообщение от Гуру77777 Посмотреть сообщение
но не знаю как создать двумерную
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
#include<bits/stdc++.h>
 
int main()
{
    std::vector<std::vector<int>> arr;
    int ROW = 3;
    int COL = 4;
    
    ///---------------------------------|
    /// Инициализация числом следования.|
    ///---------------------------------:
    int val = 0;
    for     (int i = 0; i < ROW; i++ )
    {   arr.push_back(std::vector<int>());
        for (int j = 0; j < COL; j++ )
        {   arr.back().push_back(val++);
        }
    }
    
    ///---------------------------------|
    /// Вывод массива на экран.         |
    ///---------------------------------:
    for     (int i = 0; i < ROW; i++ )
    {   for (int j = 0; j < COL; j++ )
        {   std::cout << arr[i][j] << "\t";
        }
        std::cout << "\n";
    }
}
1
693 / 303 / 99
Регистрация: 04.07.2014
Сообщений: 842
27.11.2019, 14:22 6
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
#include <vector>
#include <iostream>
 
class Matrix {
private:
  size_t m_; // количество строк
  size_t n_; // количество столбцов
  std::vector<double> a_; // храним матрицу в одномерном массиве с доступом к i,j элементу как i*n_+j
public:
 
  // Конструктор, передаём количество строк m и количество столбцов n
  Matrix(size_t m, size_t n)
    : m_(m),
      n_(n), 
      a_(m*n)
  {}
 
 
  // для внешних пользователей класса определим возможность прямого доступа к элементам
  double& operator() (size_t i, size_t j) { return a_[i*n_+j]; };
 
  // остальное реализуй по необходимости
};
 
int main() {
  size_t m=5;
  size_t n=4;
 
  Matrix A(m,n);
  for(size_t i=0; i<m; ++i) {
    for(size_t j=0; j<n; ++j) {
      A(i,j) = 10*i+j;
    }
  }
 
  for(size_t i=0; i<m; ++i) {
    for(size_t j=0; j<n; ++j) {
      std::cout << A(i,j) << "\t";
    }
    std::cout << "\n";
  }
 
  return 0;
}
Но лучше посмотри в сторону Eigen
1
Just Do It!
3425 / 1896 / 623
Регистрация: 23.09.2014
Сообщений: 5,985
Записей в блоге: 1
27.11.2019, 14:44 7
Так как число и строк и количество элементов в строках могут динамически меняться,
и иметь разное количество,
то лучше с таким массивом работать так:
C++
1
2
3
4
5
6
7
8
9
    ///---------------------------------|
    /// Вывод вектора векторов на экран.|
    ///---------------------------------:
    for     (int i = 0; i < arr.   size(); i++)
    {   for (int j = 0; j < arr[i].size(); j++)
        {   std::cout    << arr[i][j]  << "\t";
        }
        std::cout << "\n";
    }
1
фрилансер
4446 / 3957 / 866
Регистрация: 11.10.2019
Сообщений: 10,453
27.11.2019, 14:58 8
XLAT, с одномерным вектором то пошустрее всё будет
1
Just Do It!
3425 / 1896 / 623
Регистрация: 23.09.2014
Сообщений: 5,985
Записей в блоге: 1
27.11.2019, 15:39 9
Цитата Сообщение от Алексей1153 Посмотреть сообщение
XLAT, с одномерным вектором то пошустрее всё будет
преждевременная оптимизация есть зло.

да, кстати, речь о двумерных массивах,
расходы на вычисления индекса одномерного массива по номеру строки вы почему списали?

а в тиках проца сколько тактов эта разница?

давайте ка, барин, мне перфоманс тестик замутите
1
фрилансер
4446 / 3957 / 866
Регистрация: 11.10.2019
Сообщений: 10,453
27.11.2019, 16:01 10
Цитата Сообщение от XLAT Посмотреть сообщение
преждевременная оптимизация есть зло.
а, ну ок
C++
1
std::map<std::pair<size_t,size_t>,int> matrix;
всё! Можно юзать.
C++
1
matrix[7][9]=8;
Цитата Сообщение от XLAT Посмотреть сообщение
расходы на вычисления индекса
для одномерного: умножение, сложение, косвенная адресация
для вложенного: сложение, косвенная адресация, сложение, косвенная адресация

по-моему две адресации перевешивают одну

А вот пересоздание и копирование с одномерным явно меньше работы потребуют
2
Just Do It!
3425 / 1896 / 623
Регистрация: 23.09.2014
Сообщений: 5,985
Записей в блоге: 1
27.11.2019, 16:07 11
Цитата Сообщение от Алексей1153 Посмотреть сообщение
для одномерного: умножение, сложение, косвенная адресация
для вложенного: сложение, косвенная адресация, сложение, косвенная адресация
не сходится:
для одномерного: умножение, сложение, косвенная адресация
для вложенного: косвенная адресация, косвенная адресация

Где вы нашли во вложенном(arr**) массиве два сложения?
(я про вектор векторов, если чо
что там в мапе, я не в курсе.)
1
693 / 303 / 99
Регистрация: 04.07.2014
Сообщений: 842
27.11.2019, 16:27 12
Цитата Сообщение от XLAT Посмотреть сообщение
преждевременная оптимизация есть зло.
Точно так же как и запоздалая оптимизация.

Массив массивов для матриц - это классический пример именно запоздалой оптимизации. Это и медленнее (Оптимизация доступа к памяти) и больше кода (чем со специальным классом аля Matrix) и нормальное решение простое как утюг.
3
Just Do It!
3425 / 1896 / 623
Регистрация: 23.09.2014
Сообщений: 5,985
Записей в блоге: 1
27.11.2019, 16:49 13
Цитата Сообщение от AlexVRud Посмотреть сообщение
запоздалая оптимизация
запоздалая это хорошо, ведь здорово что у вас есть что оптимизировать - можно платную подписку организовать за консультации. )

а вот преждевременная(когда ничего еще нет) вам тупо проект угробит.

Добавлено через 3 минуты
AlexVRud, запустил ваш тест,
не для простых смертных:
надо лезть в сырцы чтобы понять чо там ваще тестируется.
1
-40 / 1 / 0
Регистрация: 14.11.2018
Сообщений: 617
27.11.2019, 17:07  [ТС] 14
zayats80888,Вот ток непонятно как обращаться к нему для заполнения/ Вот так?
C++
1
2
3
4
5
6
7
8
 vector<vector <int>> vector_M();
 
for (int i = 0; i < q; i++) {
        for (int j = 0; j < q; j++) {
                      vector_M[i][j] = mat[i][j] << " ";
        }
        
    }
0
Just Do It!
3425 / 1896 / 623
Регистрация: 23.09.2014
Сообщений: 5,985
Записей в блоге: 1
27.11.2019, 17:13 15
Гуру77777, нет.
смотрите мой пример выше, там где инициализация.
1
-40 / 1 / 0
Регистрация: 14.11.2018
Сообщений: 617
27.11.2019, 17:17  [ТС] 16
XLAT, Неужели через такую конструкцию?
C++
1
2
3
4
5
6
for     (int i = 0; i < ROW; i++ )
    {   arr.push_back(std::vector<int>());
        for (int j = 0; j < COL; j++ )
        {   arr.back().push_back(val++);
        }
    }
0
Just Do It!
3425 / 1896 / 623
Регистрация: 23.09.2014
Сообщений: 5,985
Записей в блоге: 1
27.11.2019, 17:40 17
Лучший ответ Сообщение было отмечено Гуру77777 как решение

Решение

или вот:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
    ///---------------------------------|
    /// Инициализация числом следования.|
    ///---------------------------------:
    int matrix[ROW][COL]; /// обычный массив на стеке.
    
    std::vector<std::vector<int>> arr;
 
    for     (int i = 0; i < ROW; i++ )
    {   arr.push_back(std::vector<int>());
        for (int j = 0; j < COL; j++ )
        {   arr.back().push_back(matrix[i][j]);
        }
    }

Цитата Сообщение от Гуру77777 Посмотреть сообщение
Неужели через такую конструкцию?
можно и по другому, но сути это не изменит.

Добавлено через 8 минут
Гуру77777,
вот такая инициализация вам может понравиться больше:
примерно этого вы и хотели.
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
#include<vector>
 
int main()
{
    ///---------------------------------|
    /// Обычный массив на стеке.        |
    ///---------------------------------:
    const int ROW = 10;
    const int COL = 5;
 
    int matrix[ROW][COL]; /// .
    
    int val = 0;
    for     (int i = 0; i < ROW; i++)
    {   for (int j = 0; j < COL; j++)
        {   matrix[i][j] = val++;
        }
    }
 
 
    ///---------------------------------|
    /// Вектор векторов.                |
    ///---------------------------------:
    std::vector<std::vector<int>> arr(ROW, std::vector<int>(COL));
 
    for     (int i = 0; i < ROW; i++)
    {   for (int j = 0; j < COL; j++)
        {   arr[i][j] = matrix[i][j];
        }
    }
 
    ///---------------------------------|
    /// Вывод V-массива на экран.       |
    ///---------------------------------:
    for     (int i = 0; i < ROW; i++)
    {   for (int j = 0; j < COL; j++)
        {   std::cout << arr[i][j] << "\t";
        }
        std::cout << "\n";
    }
 
    std::cin.get();
    return 0;
1
фрилансер
4446 / 3957 / 866
Регистрация: 11.10.2019
Сообщений: 10,453
27.11.2019, 18:04 18
Цитата Сообщение от XLAT Посмотреть сообщение
Где вы нашли во вложенном(arr**) массиве два сложения?
первое сложение - элемент по индексу в массиве массивов. Второе сложение - индекс во вложенном.

с векторами то же самое.

с мапой будет медленнее, чем с массивами.

тесты писать лень но я ставлю на одномерный массив
1
Just Do It!
3425 / 1896 / 623
Регистрация: 23.09.2014
Сообщений: 5,985
Записей в блоге: 1
27.11.2019, 18:26 19
Цитата Сообщение от Алексей1153 Посмотреть сообщение
первое сложение - элемент по индексу в массиве массивов. Второе сложение - индекс во вложенном.
вот пример, чтоб не путаться:
C++
1
2
3
4
5
6
7
8
9
int get(int** arr, size_t row, size_t col)
{
    return *(*(arr + row) + col);  ///<<<---Два действия!
}
 
int get(int* arr, size_t row, size_t col) 
{
    return *(arr + row*col + col); ///<<<---Три действия!
}
и?
0
фрилансер
4446 / 3957 / 866
Регистрация: 11.10.2019
Сообщений: 10,453
27.11.2019, 18:34 20
XLAT, так а разыменование то чего не считаешь? Самая тяжёлая тут операция.
В строке 3 их две штуки.
В строке 8 - всего одна
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
27.11.2019, 18:34
Помогаю со студенческими работами здесь

Как реализовать матрицу посредством двумерного вектора? (std::vector)
const int matrix_A_Columns = 12000; const int matrix_A_Rows = 25000; double matrix_A; как...

Как создать vector внутри класса?
#include &lt;vector&gt; using namespace std; // typedef std::vector&lt;int&gt; mantissa; class...

Как сделать двумерную матрицу с доступом не через int индексы, а через String?
В общем задача такая, нужно сделать двумерную матрицу, но доступ к ее элементам должен производится...

Как создать двумерную матрицу из данных, хранящихся в файле
Есть задача на работу с матрицей, находящейся в файле. На простом примере с фиксированным размером...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru