0 / 0 / 0
Регистрация: 16.05.2010
Сообщений: 8
1

Заполнить двумерный массив неизвестной длины

17.05.2010, 22:23. Показов 60251. Ответов 10
Метки нет (Все метки)

Всем привет, пишу на C#, надо срочно написать код на С++ и я тупо ничего не догоняю )
Необходимо заполнить двумерный массив неизвестной длины. Как это можно осуществить средствами С++ ?

Насколько я знаю, в C# нельзя динамически менять значения созданного массива типа int, НО, можно изменить его размер так:

C#
1
int[,] arr = new int[new_length_X, new_length_Y];
или же скопировать старый массив в новый при помощи Array.Copy();

К чему это я сейчас все написал? Просто хочу понять как на С++ можно сделать то же самое - динамически менять размер массива (вроде vector это умеет, но я не разобрался), ну или же копировать старый массив в новый ?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
17.05.2010, 22:23
Ответы с готовыми решениями:

Массив символов неизвестной длины
Добрый утро/день/вечер. Дело такое: вводится строка состоящая из слов и чисел(целых), разделяют...

Выделить память под массив неизвестной длины
для программы нужен массив int Array т.е. длину строки я знаю, а сколько строк у меня будет...

Выделение памяти в цикле под массив неизвестной длины
Всем привет. Есть файл, читаю по слову в string. Передаю в указатель на динамический массив char...

Прочитать массив чисел неизвестной длины. Какой контейнер использовать?
Доброго времени суток! И всех с наступающими праздниками :drink: В общем необходимо считать...

10
42 / 42 / 8
Регистрация: 22.05.2009
Сообщений: 97
17.05.2010, 23:58 2
Лучший ответ Сообщение было отмечено как решение

Решение

Если без использования Vector'а, то это будет выглядеть приблизительно так:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iostream>
...
int **dArray;
std::cout<<"Enter length of array :";
std::cin>>length_of_array;
dArray = new int*[length_of_array];
for(int i=0; i<length_of_array; i++)
{
   dArray[i] = new int [length_of_array];
}
//После всех операций с массивом его надо удалить
for(int i=0; i<length_of_array; i++)
{
   detete[] dArray[i];
}
delete[] dArray;
А все остальное можно делать исходя из того, что я написал.
15
0 / 0 / 0
Регистрация: 16.05.2010
Сообщений: 8
18.05.2010, 10:45  [ТС] 3
Спасибо! Просто нет времени читать мануалы ... надо подучить C++ ...

Добавлено через 25 минут
p.s. да, если кому надо в 14 строке ошибка невидимая - там буква 'е' по русски написана, так что если будете копипастить, знайте )
0
Эксперт С++
3220 / 1747 / 435
Регистрация: 03.05.2010
Сообщений: 3,867
18.05.2010, 13:34 4
Лучший ответ Сообщение было отмечено как решение

Решение

Размер вектора можно в любой момент увеличить функцией resize:
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
61
62
#include <vector>
#include <iostream>
 
typedef std::vector<int> T_int_vector;
typedef std::vector<T_int_vector> T_int_int_vector;
 
int& int_int_vector_elem_ref
    (
        T_int_int_vector& iiv,
        size_t            i,
        size_t            j        
    )
{
    const int               default_value = -1;
    if(iiv.size() <= i)     iiv.resize(i * 2 + 1); 
    if(iiv[i].size() <= j)  iiv[i].resize(j * 2 + 1, default_value);
    return iiv[i][j];    
}
 
int main()
{
    const size_t dim_i = 3;
    const size_t dim_j = 4;
    int A[dim_i][dim_j] = {{1,2,3,10},
                           {4,5,6,10},
                           {7,8,9,10}};
    //Создаем пустой двумерный вектор.
    T_int_int_vector v;
 
    //Выводим содержимое пустого двумерного вектора.
    for(size_t i = 0; i < dim_i; ++i)
    {
        for(size_t j = 0; j < dim_j; ++j)
        {
            std::cout << int_int_vector_elem_ref(v, i, j)
                      << ' '; 
        }
        std::cout << std::endl;
    }
 
    //Присваиваем ему значения. 
    for(size_t i = 0; i < dim_i; ++i)
    {
        for(size_t j = 0; j < dim_j; ++j)
        {
            int_int_vector_elem_ref(v, i, j) = A[i][j];
        }
    }  
 
    std::cout << std::endl;
    //Выводим содержимое заполненного двумерного вектора.
    for(size_t i = 0; i < dim_i; ++i)
    {
        for(size_t j = 0; j < dim_j; ++j)
        {
            std::cout << int_int_vector_elem_ref(v, i, j)
                      << ' '; 
        }
        std::cout << std::endl;
    }
    return 0;
}
А контейнер map при отсутствии элемента, запрашиваемого по индексу, создает его со значением по умолчанию. Если в качестве такового значения устраивает ноль, то можно так сделать:
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
#include <iostream>
#include <map>
 
typedef std::map<size_t, int>        T_int_arr;
typedef std::map<size_t, T_int_arr>  T_int_int_arr;
 
int main()
{
    const size_t dim_i = 3;
    const size_t dim_j = 4;
    int A[dim_i][dim_j] = {{1,2,3,10},
                           {4,5,6,10},
                           {7,8,9,10}};
    //Создаем пустой двумерный массив.    
    T_int_int_arr  v;
    //Присваиваем ему значения.
    for(size_t i = 0; i < dim_i; ++i)
    {
        for(size_t j = 0; j < dim_j; ++j)
        {            
            v[i][j] = A[i][j];
        }
    }
 
    //Выводим содержимое двумерного массива.    
    for(size_t i = 0; i < dim_i; ++i)
    {
        for(size_t j = 0; j < dim_j; ++j)
        {            
            std::cout << v[i][j]
                      << ' ';
        }
        std::cout << std::endl;
    } 
    return 0;
}
5
6 / 6 / 1
Регистрация: 12.10.2012
Сообщений: 71
22.04.2013, 20:26 5
Цитата Сообщение от huntex Посмотреть сообщение
p.s. да, если кому надо в 14 строке ошибка невидимая - там буква 'е' по русски написана, так что если будете копипастить, знайте )
А команда detete[] вас не смутила значит?)
1
Croessmah
22.04.2013, 22:51
  #6

Не по теме:

Цитата Сообщение от Tmin100 Посмотреть сообщение
А команда detete[] вас не смутила значит?)
Ну Вас же не смутило, что теме уже три года :)

2
0 / 0 / 0
Регистрация: 13.05.2013
Сообщений: 25
10.07.2013, 23:56 7
Цитата Сообщение от Даемоник Посмотреть сообщение
Если без использования Vector'а, то это будет выглядеть приблизительно так:

C++
1
2
3
...
   dArray[i] = new int [length_of_array];
...
То есть каждым элементом динамического массива является (динамический?) массив int [length_of_array], правильно?

Как обращаться к конечному конкретному значению?

C++
1
int k = dArray[2][2];
- так?
0
382 / 280 / 31
Регистрация: 04.09.2009
Сообщений: 1,225
13.07.2013, 02:43 8
KChelnokov, да. Ну или, что то же самое:

C++
1
int k = *((*(dArray+2))+2);
1
0 / 0 / 0
Регистрация: 13.05.2013
Сообщений: 25
15.07.2013, 00:40 9
gromo, ок, а как после заполнения этого массива получить размер получившегося вторичного i-того массива?

то есть в первом измерении мне известен размер (пусть будет 4), теперь хочу знать как заполнился каждый из моих четырех массивов.
0
2018 / 1617 / 489
Регистрация: 31.05.2009
Сообщений: 3,005
15.07.2013, 01:44 10
Цитата Сообщение от KChelnokov Посмотреть сообщение
ок, а как после заполнения этого массива получить размер получившегося вторичного i-того массива?
В общем случае никак, размер придётся хранить отдельно. Вообще, если речь идёт не об изучении указателей и т.д., а именно о двумерном динамическом массиве, лучше использовать вектор векторов(или написать собственную обёртку). Работать с указателями, как показано выше, это верный путь к утечкам памяти.
1
0 / 0 / 2
Регистрация: 08.11.2011
Сообщений: 21
24.03.2015, 14:13 11
Лучший ответ Сообщение было отмечено Памирыч как решение

Решение

Работаю админом, получаю 2-ую вышку.

Цитата Сообщение от rangerx Посмотреть сообщение
Работать с указателями, как показано выше, это верный путь к утечкам памяти.
А можно дилетантский вопрос, будет ли утечка памяти, если сработает исключение, например на этапе выделения памяти для массива типа double, и типа double*
И вообще насколько здесь высок процент быдлокода (вопрос к экспертам)

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
int n = 50000000;
int m = 50000000;
 
double **arr1;
double **arr2;
 
void initData();
void clearData();
 
int _tmain(int argc, _TCHAR* argv[])
{
    try
    {
        initData();
        clearData();
    }
    catch(bad_alloc ba)
    {cout <<"Bad Alloc: " <<ba.what();}
 
    cout <<"\nOK....\n";
    char ch = _getch();
    return 0;
}
 
void initData()
{
    arr1 = new double*[n];
    arr2 = new double*[n];
 
    for(int i=0;i<n;i++)
    {
        arr1[i] = new double[m];
        arr2[i] = new double[m];
 
        for(int j=0;j<m;j++)
        {
            arr1[i][j] = rand();
            arr2[i][j] = rand();
        }
    }
}
 
void clearData()
{
    //очищаем каждый массив по указателю из массива указателей
    for(int i=0;i<n;i++)
    {
        delete[] arr1[i];
        delete[] arr2[i];
    }
    //очищаем сами массивы указателей
    delete[] arr1;
    delete[] arr2;
 
}
Заранее спасибо!
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
24.03.2015, 14:13
Помогаю со студенческими работами здесь

STL: Создать массив длины N. Заполнить массив рандом. Найти все различные числа массива
Создать массив длины N (число N вводится с клавиатуры). Заполнить массив случайными целыми числам....

Массив: Случайным образом заполнить двумерный массив размерностью 3х4 цифрами от -20 до 10
Помогите пожалуйста с задачей Написать программу, которая случайным образом заполняет двумерный...

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

Заполнить двумерный массив
Привет ребята, такая задача, нужно массив 4 на 4 забить числами от 1 до 8, но так чтобы числа...

Заполнить двумерный массив
заполнить двухмерный массив размерности по правилу: 6 1 1 1 1 5 2 6 1 1 5 4 2 2 6 5 4 4...

Заполнить двумерный массив
Заполнить двумерный массив в соответствии с рисунком #include &lt;iostream&gt; using namespace...


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

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

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