Russian Qt Forum

Qt => Вопросы новичков => Тема начата: GamBitiK от Октябрь 07, 2014, 17:52



Название: Двумерный динамический массив
Отправлено: GamBitiK от Октябрь 07, 2014, 17:52
Ребят ,нужно создать динамический двумерный массив(резиновый)  и доступ осуществлять через mas[] [] проблема в том что не знаю размера массива и он заполняется в процессе работы. Как создать такое чудо,пробовал через qvector<qvector<int>> a; и обращался как а[0][0]=1 выкидывает аборт


Название: Re: Двумерный динамический массив
Отправлено: gil9red от Октябрь 07, 2014, 18:05
используйте std::vector или аналогичный, или высчитывайте размер массива, пример:
Код
C++ (Qt)
#include <iostream>
using namespace std;
 
int main() {
int arr[20];
cout << sizeof(arr) / sizeof(int);
return 0;
}
 


Название: Re: Двумерный динамический массив
Отправлено: GamBitiK от Октябрь 07, 2014, 18:06
Но я размера вообще не знаю


Название: Re: Двумерный динамический массив
Отправлено: __Heaven__ от Октябрь 07, 2014, 18:34
Код
C++ (Qt)
int a = 10,
    b = 20;
int* mas = new int[a][b];
 


Название: Re: Двумерный динамический массив
Отправлено: GamBitiK от Октябрь 07, 2014, 18:36
Код
C++ (Qt)
int a = 10,
    b = 20;
int* mas = new int[a][b];
 
вы же в этом коде задаете размер массива ? 10 на 20


Название: Re: Двумерный динамический массив
Отправлено: __Heaven__ от Октябрь 07, 2014, 18:48

вы же в этом коде задаете размер массива ? 10 на 20


наврал

Код
C++ (Qt)
   int a = 10,
       b = 20;
   int** mas = new int*[a];
   for (int i = 0; i < a; i++)
   {
       mas[i] = new int[b];
   }
 


Название: Re: Двумерный динамический массив
Отправлено: m_ax от Октябрь 07, 2014, 18:51
Напишите обёртку над вектором,  где определите свой оператор (i, j), который при необходимости будет менять размер массива..

Или лучше стоит сделать шаг назад и лучше продумать саму архитектуру?
    


Название: Re: Двумерный динамический массив
Отправлено: Old от Октябрь 07, 2014, 18:56
Или лучше стоит сделать шаг назад и лучше продумать саму архитектуру?
Ой накликаете сейчас... всуе используя такие слова как "архитектура". ;)


Название: Re: Двумерный динамический массив
Отправлено: GamBitiK от Октябрь 07, 2014, 19:01
мне нужно объявить начальное условие в этом массиве напримет mas[0][0]=0  и дальше дописывать mas[0][1]=5...и так далее,позволяют такие вольности Qmap qvector но как сделать что бы обращение было mas[5][5]=0 я не знаю и оберки писать не умею,нуб еще


Название: Re: Двумерный динамический массив
Отправлено: m_ax от Октябрь 07, 2014, 19:03
Или лучше стоит сделать шаг назад и лучше продумать саму архитектуру?
Ой накликаете сейчас... всуе используя такие слова как "архитектура". ;)
Двоих из лорца одинаковых с лица)  


Название: Re: Двумерный динамический массив
Отправлено: __Heaven__ от Октябрь 07, 2014, 19:06
Код
C++ (Qt)
#include <vector>
#include <iostream>
 
using namespace std;
typedef vector<int> ivec;
 
int main()
{
vector<ivec>mas(10, ivec(20));
mas[0][0] = 0;
mas[0][1] = 5;
 
cout << mas[0][0] << " " << mas[0][1];
 
return 0;
}


Название: Re: Двумерный динамический массив
Отправлено: GamBitiK от Октябрь 07, 2014, 19:09
а если мне не нужны лишнии записи там? потом нужно будет провести сортировку в каждой строке и подсчитать их количество?


Название: Re: Двумерный динамический массив
Отправлено: __Heaven__ от Октябрь 07, 2014, 19:09
Вот вам и с двумя QVector
Код
C++ (Qt)
#include <QVector>
#include <QDebug>
 
typedef QVector<int> ivec;
 
int main()
{
   int a = 10,
       b = 20;
   QVector<ivec>mas(a, ivec(b));
   mas[0][0] = 0;
   mas[0][1] = 5;
 
   qDebug() << mas[0][0] << " " << mas[0][1];
 
   return 0;
}
 


Название: Re: Двумерный динамический массив
Отправлено: __Heaven__ от Октябрь 07, 2014, 19:11
https://ru.wikipedia.org/wiki/Vector_(C%2B%2B) (https://ru.wikipedia.org/wiki/Vector_(C%2B%2B))


Название: Re: Двумерный динамический массив
Отправлено: GamBitiK от Октябрь 07, 2014, 19:17
wiki это классно,но все же как ?


Название: Re: Двумерный динамический массив
Отправлено: m_ax от Октябрь 07, 2014, 19:34
Вот вам и с двумя QVector
Код
C++ (Qt)
#include <QVector>
#include <QDebug>
 
typedef QVector<int> ivec;
 
int main()
{
   int a = 10,
       b = 20;
   QVector<ivec>mas(a, ivec(b));
   mas[0][0] = 0;
   mas[0][1] = 5;
 
   qDebug() << mas[0][0] << " " << mas[0][1];
 
   return 0;
}
 

Да не знает ТС заранее, какой у него размер массива.. Вот у вас он сейчас 10 на 20, а ему нужно поведение, аналогичное map'у..
 


Название: Re: Двумерный динамический массив
Отправлено: m_ax от Октябрь 07, 2014, 19:44
Вот самый наивный способ, как добиться того, чего хочет ТС:
Код
C++ (Qt)
template <class T>
using rubber_array2d = std::map<int, std::map<int, T>>;
 
rubber_array2d<int> array;
array[0][0] = 1;
array[0][1] = 3;
// и т.д..
 




Название: Re: Двумерный динамический массив
Отправлено: GamBitiK от Октябрь 07, 2014, 20:20
Сделал через Qmap<int,Qmap<int,int> > а и все работает обращаюсь как a[][]=0


Название: Re: Двумерный динамический массив
Отправлено: GamBitiK от Октябрь 07, 2014, 20:22
спасибо большое всем


Название: Re: Двумерный динамический массив
Отправлено: kambala от Октябрь 07, 2014, 21:44
чувствую преподаватель такую халтуру не одобрит :D


Название: Re: Двумерный динамический массив
Отправлено: m_ax от Октябрь 07, 2014, 23:12
чувствую преподаватель такую халтуру не одобрит :D
Ой, очень хотелось бы в это верить..  Но, лично у меня, не такой оптимистический прогноз..( 


Название: Re: Двумерный динамический массив
Отправлено: kambala от Октябрь 07, 2014, 23:25
ТС: если возникают сложности с вектором векторов, можно и одномерным вектором реализовать. тогда элементу [i ][j] будет соответствовать элемент [i*n + j].


Название: Re: Двумерный динамический массив
Отправлено: m_ax от Октябрь 07, 2014, 23:44
ТС: если возникают сложности с вектором векторов, можно и одномерным вектором реализовать. тогда элементу [i ][j] будет соответствовать элемент [i*n + j].
Я боюсь, что там возникнут уже другие сложности..


Название: Re: Двумерный динамический массив
Отправлено: Alexu007 от Октябрь 08, 2014, 05:46
Код
C++ (Qt)
Qmap<int, Qmap<int, int> > a;

А в чём тут проблема и как в Qt правильно создать многомерный динамический массив?



Название: Re: Двумерный динамический массив
Отправлено: gil9red от Октябрь 08, 2014, 08:26
Код
C++ (Qt)
Qmap<int, Qmap<int, int> > a;

А в чём тут проблема и как в Qt правильно создать многомерный динамический массив?



QMap?
И кидайте ругательства от компилятора, тут форум программистов, а не экстрасенсов :)


Название: Re: Двумерный динамический массив
Отправлено: Igors от Октябрь 08, 2014, 08:32
Код
C++ (Qt)
Qmap<int, Qmap<int, int> > a;

А в чём тут проблема и как в Qt правильно создать многомерный динамический массив?
Проблема в затратности такого решения - как по памяти так и по скорости. Да и удобно лишь на первый взгляд, напр
Код
C++ (Qt)
for (int i = 0; i < numRow; ++i)
for (int j = 0; j < numCol; ++j)
 arr[i][j] = 0;
Откуда возьмете numRow/numCol ?

Если планируются интенсивные удаления/вставки то правильно "вектор векторов", а если нет то лучше через одномерный. Возможно придется повозиться с вставкой строк/столбов, но это только полезно - не привыкайте "пастись на готовом"