Форум программистов, компьютерный форум, киберфорум
Наши страницы
C++/CLI
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.60/55: Рейтинг темы: голосов - 55, средняя оценка - 4.60
nchameleon
2 / 2 / 5
Регистрация: 06.04.2010
Сообщений: 164
#1

Создание, заполнение и управление динамическими массивами

13.08.2010, 16:54. Просмотров 9888. Ответов 7
Метки нет (Все метки)

Добрый день, помогите пожалуста с многомерными массивами в С++ и С++\CLR

Просто обявление массива
C++
1
2
int d1[10];
int d[10,5];
1) Одномерный динамический массив
C++
1
2
3
4
5
6
int* a = new int[10]; //объявление в С++
a[0] = 10; //доступ
delete a; // обязательное удаление
 
array<int>^ k = gcnew array<int>(10,10); // объявление С++\CLR
k[0] = 10; //доступ
а вот как задать многомерный динамиеский массив массив в С++ и С++\CLR ?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.08.2010, 16:54
Ответы с готовыми решениями:

Создание и работа в C# с динамическими массивами
Работаю с VBA там есть возможность переопределять размер массива Например...

Создание и управление динамическими структурами
Подскажите, как реализовать такое: Создать динамическую структуру, что-то...

Странности с динамическими массивами.
Добрый день! В общем как то при выполнении одной лабы, я столкнулся с одной...

Работа с динамическими массивами
Ошибка чтения данных возникает при работе с динамическими массивами: ...

Работа с динамическими массивами
Можно ли так делать? type TMass = array of Integer; function...

7
cibertronic
256 / 143 / 17
Регистрация: 27.12.2009
Сообщений: 908
13.08.2010, 17:00 #2
Цитата Сообщение от nchameleon Посмотреть сообщение
int d[10,5];
так нельзя обьявлять двумерный массив в с++

а так:
Код
int d[10][5];
Добавлено через 1 минуту
динамический массив посмотри тут
1
NightmareZ
1424 / 612 / 59
Регистрация: 31.03.2009
Сообщений: 1,986
13.08.2010, 17:33 #3
Лучший ответ Сообщение было отмечено как решение

Решение

Простой массив на стеке (не динамический):

C++
1
2
3
4
5
6
7
8
9
10
// C++, одномерный
int arr1[10]; // создаём
arr1[0] = 5; // доступ
// удалять не нужно, будет удалён при выходе из блока
    
 
// С++, двумерный
int arr2[10][10]; // создаём
arr2[0][0] = 5; // доступ
// удалять не нужно, будет удалён при выходе из блока
Динамический:

C++
1
2
3
4
5
6
7
8
9
10
11
12
// C++, одномерный, динамический
int* arr3 = new int[10];  // создаём
arr3[0] = 5; // доступ
delete[] arr3; // удаляем
 
 
// C++, двумерный, динамический
int** arr4 = new int*[10];  // создаём
for (int i = 0; i < 10; i++) arr4[i] = new int[10];
arr4[0][0] = 5; // доступ
for (int i = 0; i < 10; i++) delete[] arr4[i]; // удаляем
delete[] arr4;
Вектор:

C++
1
2
3
4
5
6
7
8
9
10
11
// C++, одномерный, вектор
std::vector<int> arr5(10); // создаём
arr5[0] = 5; // доступ
// удалять не нужно, будет удалён при выходе из блока
 
 
// C++, двумерный, вектор
std::vector<std::vector<int>> arr6(10); // создаём
arr6[0].push_back(1);
arr6[0][0] = 5; // доступ
// удалять не нужно, будет удалён при выходе из блока
Вектор, динамический:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// C++, одномерный, вектор, динамический
std::vector<int>* arr7 = new std::vector<int>(10); // создаём
//(*arr7)[0] = 5; // доступ
arr7->at(0) = 5; // доступ
delete arr7;// удаляем
 
 
// C++, двумерный, вектор, динамический
std::vector<std::vector<int>*>* arr8 = new std::vector<std::vector<int>*>(10); // создаём
//for (int i = 0; i < 10; i++) (*arr8)[i] = new std::vector<int>(10);
for (int i = 0; i < 10; i++) arr8->at(i) = new std::vector<int>(10);
//(*(*arr8)[0])[0] = 5; // доступ
arr8->at(0)->at(0) = 5; // доступ
//for (int i = 0; i < 10; i++) delete (*arr8)[i]; // удаляем
for (int i = 0; i < 10; i++) delete arr8->at(i); // удаляем
delete arr8;
Управляемый массив:

C++
1
2
3
4
5
6
7
8
9
10
11
// CLR, одномерный
cli::array<int>^ arr9 = gcnew cli::array<int>(10); // создаём
arr9[0] = 5; // доступ
// удалять не нужно, будет удалён при сборке мусора
 
 
// CLR, двумерный
cli::array<array<int>^>^ arr10 = gcnew cli::array<array<int>^>(10); // создаём
for (int i = 0; i < 10; i++) arr10[i] = gcnew cli::array<int>(10);
arr10[0][0] = 5; // доступ
// удалять не нужно, будет удалён при сборке мусора
10
nchameleon
2 / 2 / 5
Регистрация: 06.04.2010
Сообщений: 164
13.08.2010, 18:51  [ТС] #4
NightmareZ четко и понятно помог

тогда вопрос
1) отличие std::vector от cli::array

2) и в C# можно было объявлять int[,] f = new int[10,50]; массив получался сразу двух мерный, подобноо нету в С++\CLR ? (больно уж удобно и мало места в строчках )
0
NightmareZ
1424 / 612 / 59
Регистрация: 31.03.2009
Сообщений: 1,986
13.08.2010, 19:37 #5
Цитата Сообщение от nchameleon Посмотреть сообщение
1) отличие std::vector от cli::array
std::vector - это контейнер из STL, стандартной библиотеки C++, он нативный и никаким образом к CLR не относится. Но, как и остальной код на C++, его пожно использовать и на C++/CLI.

cli::array - это родной для .NET массив (именно он юзается и в C# и в VB.NET), в нём есть проверка на выход за пределы массива, etc.

Цитата Сообщение от nchameleon Посмотреть сообщение
2) и в C# можно было объявлять int[,] f = new int[10,50]; массив получался сразу двух мерный, подобноо нету в С++\CLR ? (больно уж удобно и мало места в строчках )
Можно и так:
C#
1
2
cli::array<int, 2>^ arr = gcnew cli::array<int, 2>(10, 10); // создаём
arr[0, 0] = 5; // доступ
2
knofl
19 / 19 / 1
Регистрация: 05.04.2010
Сообщений: 122
13.08.2010, 19:40 #6
nchameleon, 1. В std::vector можно добавлять новые элементы в конец, также и удалять, он вообще может быть пустым, а дим массивы насколько я знаю размер нельзя изменить после создания.
2. Да на самом деле в C# можно было так объявлять, да и сейчас никто не мешает ето делать, но C# всё-таки другой язык и изначально .net ориентирован, а в C++ такого никогда не было, вот так вот.
0
NightmareZ
1424 / 612 / 59
Регистрация: 31.03.2009
Сообщений: 1,986
13.08.2010, 19:53 #7
Лучший ответ Сообщение было отмечено как решение

Решение

Цитата Сообщение от knofl Посмотреть сообщение
nchameleon, 1. В std::vector можно добавлять новые элементы в конец, также и удалять, он вообще может быть пустым, а дим массивы насколько я знаю размер нельзя изменить после создания.
В C++/CLI (и в .NET вообще) можно изменить размер массива:
C++
1
2
cli::array<int>^ arr = gcnew cli::array<int>(10);
cli::array<int>::Resize(arr, 50);
Цитата Сообщение от knofl Посмотреть сообщение
2. Да на самом деле в C# можно было так объявлять, да и сейчас никто не мешает ето делать, но C# всё-таки другой язык и изначально .net ориентирован, а в C++ такого никогда не было, вот так вот.
Я постом выше написал, как это в C++/CLI сделать.
3
knofl
19 / 19 / 1
Регистрация: 05.04.2010
Сообщений: 122
13.08.2010, 19:56 #8
NightmareZ, А, спасибо, терь буду знать.
0
13.08.2010, 19:56
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.08.2010, 19:56

Работа с динамическими массивами
Создать одномерный динамический массив произ-вольного размера. Ввести значения...

Работа с динамическими массивами
Здравствуйте. Помогите, пожалуйста, написать программу 1. Использующую потоки...

программка с динамическими массивами
1. Ввести размер массива; 2.Сформировать массив с помощью операции new или...


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

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

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