Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 426, средняя оценка - 4.88
huntex
0 / 0 / 0
Регистрация: 16.05.2010
Сообщений: 8
#1

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

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

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

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

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

К чему это я сейчас все написал? Просто хочу понять как на С++ можно сделать то же самое - динамически менять размер массива (вроде vector это умеет, но я не разобрался), ну или же копировать старый массив в новый ?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.05.2010, 22:23
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Заполнить двумерный массив неизвестной длины (C++):

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

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

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

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

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

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

10
Даемоник
42 / 42 / 3
Регистрация: 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
huntex
0 / 0 / 0
Регистрация: 16.05.2010
Сообщений: 8
18.05.2010, 10:45  [ТС] #3
Спасибо! Просто нет времени читать мануалы ... надо подучить C++ ...

Добавлено через 25 минут
p.s. да, если кому надо в 14 строке ошибка невидимая - там буква 'е' по русски написана, так что если будете копипастить, знайте )
0
Mr.X
Эксперт С++
3051 / 1696 / 265
Регистрация: 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
Tmin100
6 / 6 / 0
Регистрация: 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
KChelnokov
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
gromo
372 / 271 / 24
Регистрация: 04.09.2009
Сообщений: 1,214
13.07.2013, 02:43 #8
KChelnokov, да. Ну или, что то же самое:

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

то есть в первом измерении мне известен размер (пусть будет 4), теперь хочу знать как заполнился каждый из моих четырех массивов.
0
rangerx
1937 / 1546 / 141
Регистрация: 31.05.2009
Сообщений: 2,913
15.07.2013, 01:44 #10
Цитата Сообщение от KChelnokov Посмотреть сообщение
ок, а как после заполнения этого массива получить размер получившегося вторичного i-того массива?
В общем случае никак, размер придётся хранить отдельно. Вообще, если речь идёт не об изучении указателей и т.д., а именно о двумерном динамическом массиве, лучше использовать вектор векторов(или написать собственную обёртку). Работать с указателями, как показано выше, это верный путь к утечкам памяти.
1
mactator
0 / 0 / 1
Регистрация: 08.11.2011
Сообщений: 19
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
24.03.2015, 14:13
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.03.2015, 14:13
Привет! Вот еще темы с ответами:

Чтение строки неизвестной длины - C++
реализация на СИ как прочитать строку неизвестной длины? Чтение должно быть не посимвольным. Строка вводиться вручную.

Ввод массива неизвестной длины - C++
Добрый день! Уважаемые знатоки, вопрос скорее всего тривиальный, но тем не менее решения у меня нет. Нужно задать вектор через пробелы...

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

Заполнить двумерный массив - C++
Заполнить двумерный массив в соответствии с рисунком #include &lt;iostream&gt; using namespace std; int main(){ //a)запись...


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

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

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