Модераторы: bsa

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> как создать двухмерный динамический массив? 
V
    Опции темы
Gunslinger
Дата 3.3.2009, 11:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 842
Регистрация: 30.12.2006
Где: Астрахань

Репутация: нет
Всего: 3



Привет.
Знаю, как создавать только одномерные. Этот код сделал, просматривая аналогичные темы, поэтому не уверен в его правильности.
Задача: создать 2хмерный массив по размерностям, введенным пользователем. В течении работы программы массив не изменяется. Массив не обязательно квадратный.
Код

       int x;
       int y;    
       cin >> x;//--ооп убрал для легкости кода
       cin >>y;

    int** mass = new int*[x];
    for (int i = 0; i <= x; i++) 
                 for (int j = 1; j <= y; j++)   
                           mass[i][j] = new int [j];
                                                          

з.ы. код для билдера, вектором пользоваться не умею, как подключить stl - не знаю. так что vector не советуйте.
PM MAIL   Вверх
bsa
Дата 3.3.2009, 11:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



Учимся пользоваться поиском: [FAQ] Динамические массивы

Добавлено через 51 секунду
Цитата(Gunslinger @ 3.3.2009,  11:42)
з.ы. код для билдера, вектором пользоваться не умею, как подключить stl - не знаю. так что vector не советуйте.

Это минус. Учись!
PM   Вверх
Gunslinger
Дата 3.3.2009, 12:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 842
Регистрация: 30.12.2006
Где: Астрахань

Репутация: нет
Всего: 3



#include<vector.h> 
если      
Код

vector<int> mass[5][5];

то ошибок нет.
если
Код

int r=5;
vector<int> mass[r][r];

ошибки:
E2313 Constant expression required
E2313 Constant expression required

PM MAIL   Вверх
azesmcar
Дата 3.3.2009, 12:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 52
Всего: 211



Цитата

vector<int> mass[5][5];


это ты матрицу векторов создаешь.

Код

#include <vector>

int main()
{
   //создать вектор (массив)
   std::vector<int> vec;

   //добавить элементы
   vec.push_back( 1 );
   vec.push_back( 2 );
   vec.push_back( 3 );

   //поиск по вектору и изменение значения
   std::vector<int>::iterator it = std::find(vec.begin(), vec.end(), 2);
   *it = 4;

   //поиск и удаление из вектора
   it = std::find(vec.begin(), vec.end(), 1);
   vec.erase(it);
   
   //очистка вектора
   vec.clear();

   //вывод вектора в консоль
   for (std::vector<int>::iterator i = vec.begin(); i != vec.end(); ++i)
      std::cout << *it << std::endl;

   //вывод вектора в консоль - другой способ
   std::copy(vec.begin(), vec.end(), std::ostream_iterator(std::cout, "\n"));
}


Добавлено через 2 минуты и 19 секунд
а матрица тебе не нужна, вектор вполне ее заменяет.

к примеру если нужна матрица 8х8, заполнаешь 64 элемента вектора..а далее мат. операции с индексами.
PM   Вверх
Anikmar
Дата 3.3.2009, 12:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 5
Всего: 59



Я для новичков лично всегда советую начинать с ручных массивов, а затем переходить к STL, чтобы оценить все удобство.

Создание квадратной матрицы:
Код

int **MatrixA;
int SizeMatrix = 5;

void CreateMatrix(void)
{
    MatrixA = new int *[SizeMatrix];
    for(int i=0;i<SizeMatrix;i++) MatrixA[i] = new int[SizeMatrix];
}



Добавлено через 1 минуту и 15 секунд
Чуть не забыл: учимся убирать за собой
Код

void DeleteMatrix(void)
{
    for(int i=0;i<SizeMatrix;i++) delete[] MatrixA[i];
    delete[]MatrixA;
}


PM MAIL ICQ   Вверх
azesmcar
Дата 3.3.2009, 12:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 52
Всего: 211



Цитата

Я для новичков лично всегда советую начинать с ручных массивов, а затем переходить к STL, чтобы оценить все удобство.


согласен, да и знать не повредит, в моей практие бывали случаи когда СТЛ низя ) на Си надо было писать..знания никому не помешают..
PM   Вверх
Gunslinger
Дата 3.3.2009, 14:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 842
Регистрация: 30.12.2006
Где: Астрахань

Репутация: нет
Всего: 3



Цитата(Anikmar @  3.3.2009,  12:50 Найти цитируемый пост)
Создание квадратной матрицы:
Код

int **MatrixA;
int SizeMatrix = 5;
void CreateMatrix(void)
{
    MatrixA = new int *[SizeMatrix];
    for(int i=0;i<SizeMatrix;i++) MatrixA[i] = new int[SizeMatrix];
}



Создали строку (размерность х). Затем к каждому элементу строки создали еще одну строку (размерность у).
PM MAIL   Вверх
GoldFinch
Дата 3.3.2009, 15:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

Репутация: 6
Всего: 26



%)
2мерный (и N мерный) массив делается из 1мерного, 
[x,y]=[y*cx+y]
массивы указателей на массивы - редкостный бред
PM MAIL ICQ   Вверх
Anikmar
Дата 3.3.2009, 15:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 5
Всего: 59



Цитата(GoldFinch @  3.3.2009,  15:01 Найти цитируемый пост)
массивы указателей на массивы - редкостный бред 

Вам виднее, наверное. Вот только создателям С++ надо вашу точку зрения надо обязательно донести.

Если вы создадите динамический двухмерный массив как одномерный - как вы будете использовать стандартный синтаксис вида [][]?

Добавлено через 5 минут и 6 секунд
Цитата(azesmcar @  3.3.2009,  12:53 Найти цитируемый пост)
согласен, да и знать не повредит, в моей практие бывали случаи когда СТЛ низя ) на Си надо было писать..знания никому не помешают.. 

Дело в том, что многие увлекаются STL считая ее панацеей и не следя за собственным кодом. Надо просто четко знать в каких случаях ее целесообразно применить.
Если создается несколько десятков разных типов, затем запихиваются в вектора никто и не думает, что для каждого типа создается по сути свой экземпляр класса и лучше подумать как минимизировать их количество. С другой стороны многие зачем-то пишут свою сортировку, забыв о наличии STL и ее алгоритмов.
PM MAIL ICQ   Вверх
bsa
Дата 3.3.2009, 15:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



Gunslinger, ты не прочитал ту тему, ссылку на которую я тебе дал? Там же я разжевывал все возможные (на мой взгляд) варианты.
PM   Вверх
azesmcar
Дата 3.3.2009, 15:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 52
Всего: 211



Цитата

Вам виднее, наверное. Вот только создателям С++ надо вашу точку зрения надо обязательно донести.

 smile

Цитата

Если вы создадите динамический двухмерный массив как одномерный - как вы будете использовать стандартный синтаксис вида [][]?


синтаксис этого типа поддержать не получиться конечно, но как обратиться с помощью x-y он написал. Думаю тут дело вкуса. Смотря для чего как. Мне для шашек легче было одномерный хранить. 

Цитата

Дело в том, что многие увлекаются STL считая ее панацеей и не следя за собственным кодом. Надо просто четко знать в каких случаях ее целесообразно применить.
Если создается несколько десятков разных типов, затем запихиваются в вектора никто и не думает, что для каждого типа создается по сути свой экземпляр класса и лучше подумать как минимизировать их количество. С другой стороны многие зачем-то пишут свою сортировку, забыв о наличии STL и ее алгоритмов.


STL штука хорошая конечно, но в неумелых руках она может привезти к потере эффективности. Потому всем кто собирается его учить - Майерса читать обязательно.

Anikmar, кстати как задачу для новичков можно дать что-то типа стл контейнера для 2х мерного массива. С поддержкой синтаксиса [][]

Это сообщение отредактировал(а) azesmcar - 3.3.2009, 15:52
PM   Вверх
Anikmar
Дата 3.3.2009, 16:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 5
Всего: 59



Цитата(azesmcar @  3.3.2009,  15:49 Найти цитируемый пост)
синтаксис этого типа поддержать не получиться конечно, но как обратиться с помощью x-y он написал. Думаю тут дело вкуса. Смотря для чего как. Мне для шашек легче было одномерный хранить. 


Все зависит от задачи. При больших массивов и мнократных вычислениях индекса скорость при динамическом индексе проиграет - сто раз уже  проверяли и спорили. Хотя дело вкуса, конечно, но я приверенженец стандартного синтаксиса.


Цитата(azesmcar @  3.3.2009,  15:49 Найти цитируемый пост)
Anikmar, кстати как задачу для новичков можно дать что-то типа стл контейнера для 2х мерного массива. С поддержкой синтаксиса [][]


Не понял вопроса. Вы имеете в виду как будет выглядеть код? Например такой:
Код

    vector<vector<int> > a(10,vector<int>(10));

    for (int i=0;i<10;i++)
        for(int j=0;j<10;j++)
            a[i][j] = i*j;

    for (int i=0;i<10;i++)
    {
        for(int j=0;j<10;j++) printf("%d ",a[i][j]);
        printf("\n");
    }



PM MAIL ICQ   Вверх
azesmcar
Дата 3.3.2009, 16:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 52
Всего: 211



Цитата

Не понял вопроса. Вы имеете в виду как будет выглядеть код? Например такой:


ну, это не совсем вопрос, а скорее предложение. Ты сказал

Цитата

Я для новичков лично всегда советую начинать с ручных массивов, а затем переходить к STL, чтобы оценить все удобство.


задачка написать шаблонный класс - для матрицы. Типа вектора, но чтобы хранил матрицу, и с стандартными операторами и поддержкой [][].

Добавлено через 1 минуту и 28 секунд
хорошая задачка для освоения работы с матрицами и массивами.
PM   Вверх
Anikmar
Дата 3.3.2009, 16:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 5
Всего: 59



Цитата(azesmcar @  3.3.2009,  16:07 Найти цитируемый пост)
задачка написать шаблонный класс - для матрицы. Типа вектора, но чтобы хранил матрицу, и с стандартными операторами и поддержкой [][].

Я не предлагал писать шаблонные классы. Я предлагал создавать динамические массивы ручками, а затем при помощи STL - чтобы прочуствовать разницу.

А задача написания шаблонного класса для матрицы - это из разряда вообще написать шаблонный класс. Готовые шаблоны для матриц наверняка уже существуют, зачем изобретать велосипед, а матрицу на векторах я уже показал.
PM MAIL ICQ   Вверх
azesmcar
Дата 3.3.2009, 16:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 52
Всего: 211



Цитата

Я не предлагал писать шаблонные классы. Я предлагал создавать динамические массивы ручками, а затем при помощи STL - чтобы прочуствовать разницу.


я знаю, это я предложил smile наверное непонйятно выразился. Я имел ввиду новичкам давать такую задачу, для практики.

Цитата

А задача написания шаблонного класса для матрицы - это из разряда вообще написать шаблонный класс. Готовые шаблоны для матриц наверняка уже существуют, зачем изобретать велосипед, а матрицу на векторах я уже показал.


для практики..новичкам вообще полезно изобретать велосипеды по моему, лучше поймут как все устроено и как работает. Я же не говорил давай мы с тобой напишем  smile 


PM   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0606 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.