1 / 1 / 1
Регистрация: 05.04.2008
Сообщений: 48
1

Изменение размера массива

18.03.2010, 00:23. Показов 85746. Ответов 15
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Подскажите плиз, как на С++ изменить размер массива, есть например

int *pi = new int[10];

А нужно увеличить +1 элемент, не потеряв предыдущих данных ?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
18.03.2010, 00:23
Ответы с готовыми решениями:

Изменение размера массива
Как без использования функций изменить размер массива? int x=10; int m1; int m2; int m3; iny...

Изменение размера массива
Допустим в main-е я объявил указатель определенного типа и создал переменную int size, затем адрес...

Изменение размера массива
Задача такая: нужно добавить в массив элемент так что бы он стоял в начале массива или...

Изменение размера массива
Здравствуйте. Я хочу написать массив в который записываются введенные данные. Массив должен...

15
3527 / 2685 / 334
Регистрация: 11.03.2009
Сообщений: 6,163
18.03.2010, 03:02 2
Копируешь массив во временный, освобождаешь память, выделяешь по новой нужного размера, копируешь из временного обратно в основной, удаляешь временный.
1
1 / 1 / 1
Регистрация: 05.04.2008
Сообщений: 48
18.03.2010, 14:17  [ТС] 3
Скажите а такой подход не верен?

C++
1
2
3
4
5
6
7
8
9
10
int *x = new int[1];
size_t size;
for(int i=0;i<100;i++)
{
        x[i] = i;
 
    size = _msize( x );
    realloc( x,(size + sizeof(int)));
 
}
1
1665 / 1134 / 80
Регистрация: 21.08.2008
Сообщений: 4,734
Записей в блоге: 1
18.03.2010, 14:20 4
Цитата Сообщение от softrix Посмотреть сообщение
Скажите а такой подход не верен?
не верен
0
2021 / 1620 / 489
Регистрация: 31.05.2009
Сообщений: 3,005
18.03.2010, 14:29 5
А нужно увеличить +1 элемент, не потеряв предыдущих данных ?
использовать std::vector.
0
Эксперт С++
5043 / 2622 / 241
Регистрация: 07.10.2009
Сообщений: 4,310
Записей в блоге: 1
18.03.2010, 14:51 6
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
/*
    Изменение размера массива
*/
 
int main()
{
    // Размер исходного массива 
    int const a_size = 10;
    // Выделение памяти под исходнйы массив
    int * a = new int [a_size];
    // Заполнение исходного массива случайными значениями
    for(int i = 0; i < a_size; ++i)
            a[i] = rand() % 9 + 1;
 
 
    // Вывод массива на экран
    std::cout << "array a: ";
    std::copy(a, a + a_size, std::ostream_iterator<int>(std::cout, " ")); 
    std::cout << std::endl;
 
    int b_size = 0;
    std::cout << "enter new size: ";
    std::cin >> b_size;
                    
    // Выделение памяти под новый массив и его заполнение
    int * b = new int[b_size];
    memset(b, 0, sizeof(int) * b_size);
    
    // Копирование
    std::copy(a, a + std::min(a_size, b_size), b);
    
    // Освобождение памяти из под исходного массива
    delete[] a;
 
    // Вывод нового массива
    std::cout << "array b: ";
    std::copy(b, b + b_size, std::ostream_iterator<int>(std::cout, " "));
    std::cout << std::endl;
 
    // Память освобождать надо всегда!
    delete [] b;
}
Добавлено через 12 минут
Еще можно поиздеваться и написать подобную функцию
C++
1
2
3
4
5
6
7
8
9
10
11
12
// Изменение размера массива
int * Resize(int * a, int oldSize, int newSize)
{
    int * t = new int[newSize];
    memset(t, 0, sizeof(int) * newSize);
    
    std::copy(a, a + std::min(oldSize, newSize), t);
    
    delete[] a;
 
    return t;
}
Пользуяюсь ею следующим образом
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
    // Размер исходного массива 
    int a_size = 10;
    // Выделение памяти под исходнйы массив
    int * a = new int [a_size];
    // Заполнение исходного массива случайными значениями
    for(int i = 0; i < a_size; ++i)
        a[i] = rand() % 9 + 1;
 
    // Вывод массива на экран
    std::cout << "array a: ";
    std::copy(a, a + a_size, std::ostream_iterator<int>(std::cout, " ")); 
    std::cout << std::endl;
 
    int b_size = 0;
    std::cout << "enter new size : ";
    std:: cin >> b_size;
    
    a = Resize(a, a_size, b_size);
    a_size = b_size;
    
    // Вывод массива на экран
    std::cout << "array a: ";
    std::copy(a, a + a_size, std::ostream_iterator<int>(std::cout, " ")); 
    std::cout << std::endl;
Добавлено через 1 минуту
Цитата Сообщение от rangerx Посмотреть сообщение
использовать std::vector.
Но этот вариант конечно самый благоразумный
0
1 / 1 / 1
Регистрация: 05.04.2008
Сообщений: 48
18.03.2010, 14:51  [ТС] 7
fasked:

Спасибо за пример, а без использования библиотеки std, как можно сделать ?
0
Эксперт С++
5043 / 2622 / 241
Регистрация: 07.10.2009
Сообщений: 4,310
Записей в блоге: 1
18.03.2010, 14:52 8
Цитата Сообщение от softrix Посмотреть сообщение
Спасибо за пример, а без использования библиотеки std, как можно сделать ?
Сейчас на Си накатаю =)
1
1 / 1 / 1
Регистрация: 05.04.2008
Сообщений: 48
18.03.2010, 14:54  [ТС] 9
Спасибо, а то проблема в том, что эта функция будет в dll, которую я буду к java подключать, не уверен, что данные из вектора смогу нормально в яву передать.
0
Evg
Эксперт CАвтор FAQ
21276 / 8298 / 637
Регистрация: 30.03.2009
Сообщений: 22,659
Записей в блоге: 30
18.03.2010, 14:58 10
Цитата Сообщение от softrix Посмотреть сообщение
Скажите а такой подход не верен?
Нет, то что выделено через new нельзя перевыделять через realloc. Разработчики Си++ слишком увлеклись и не предусмотрели человеческого варианта перевыделения памяти средствами языка. Поэтому проще всего с такой памятью работать с malloc/realloc/free, а не с new/delete
0
Эксперт С++
5043 / 2622 / 241
Регистрация: 07.10.2009
Сообщений: 4,310
Записей в блоге: 1
18.03.2010, 14:58 11
Без извращенной функции
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
#include <stdlib.h>
#include <stdio.h>
#include <memory.h>
 
/*
    Изменение размера массива
*/
 
#define min(a,b) (((a) < (b)) ? (a) : (b))
 
// Заполнение массива случайными значениями
void random(int * a, int size)
{
        while(size--)
                *a++ = rand() % 9 + 1;
}
// Вывод массива на экран
void output(int * a, int size)
{
        while(size--)
                printf("%d ", *a++);
        printf("\n");
}
 
int main()
{
        int a_size = 10,        // Размер исходного массива 
                i = 0, j = 0;   // Счетчики
 
                
        // Выделение памяти под исходный массив
        int * a = (int * )malloc(sizeof(int) * a_size);
        // Заполнение исходного массива случайными значениями
        random(a, a_size);      
        // Вывод массива на экран
        output(a, a_size);
 
        // Ввод нового размера
        int b_size = 0;
        printf("Enter new Size: ");
        scanf("%d", &b_size);
        
        // Выделение памяти под новый массив
        int * b = (int * )malloc(sizeof(int) * b_size);
        memset(b, 0, sizeof(int) * b_size);
        
        // Копирование
        memcpy(b, a, sizeof(int) * min(a_size, b_size));
        
        // Освобождение памяти из под исходного массива
        free(a);
        
        // Вывод нового массива
        output(b, b_size);
        
        // Память освобождать надо всегда!
        free(b);
}

С функцией
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
#include <stdlib.h>
#include <stdio.h>
#include <memory.h>
 
/*
    Изменение размера массива
*/
 
#define min(a,b) (((a) < (b)) ? (a) : (b))
 
// Заполнение массива случайными значениями
void random(int * a, int size)
{
        while(size--)
                *a++ = rand() % 9 + 1;
}
// Вывод массива на экран
void output(int * a, int size)
{
        while(size--)
                printf("%d ", *a++);
        printf("\n");
}
// Изменение размера массива
int * resize(int * a, int newsize, int oldsize)
{
    int * b = (int * )malloc(sizeof(int) * newsize);
    memset(b, 0, sizeof(int) * newsize);
    memcpy(b, a, sizeof(int) * min(oldsize, newsize));
 
    free(a);
    
    return b;
}
 
int main()
{
        int a_size = 10; 
                
        int * a = (int * )malloc(sizeof(int) * a_size);
        random(a, a_size);      
        output(a, a_size);
 
        // Ввод нового размера
        int b_size = 0;
        printf("Enter new Size: ");
        scanf("%d", &b_size);
        
        // Тут применяем изврат
        a = resize(a, b_size, a_size);
        a_size = b_size;
        
        // Вывод нового массива
        output(a, a_size);
        
        free(a);
}
0
Evg
Эксперт CАвтор FAQ
21276 / 8298 / 637
Регистрация: 30.03.2009
Сообщений: 22,659
Записей в блоге: 30
18.03.2010, 15:11 12
В первом примере строки 44-48 смело нужно заменять на realloc и не извращаться
0
1 / 1 / 1
Регистрация: 05.04.2008
Сообщений: 48
18.03.2010, 15:22  [ТС] 13
fasked спасибо, т.е. у меня должно получить что-то вроде этого ?

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
  int *x;
  int *oldx;
  size_t size;
 
  x = (int *)malloc( 1 * sizeof( int ) );
 
for(int i=0;i<10;i++)
{
 
  x[i] = i;
  size = _msize( x );
  oldx = x;     // save pointer in case realloc fails
  realloc( x, size + (sizeof( int )));
 
}
  free( x );
0
Эксперт С++
5043 / 2622 / 241
Регистрация: 07.10.2009
Сообщений: 4,310
Записей в блоге: 1
18.03.2010, 15:37 14
C
1
x = (int *) realloc( x, size * (sizeof( int )));
перепишу строку 15

Добавлено через 9 минут
вот накрапал твою схему
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <stdio.h>
#include <stdlib.h>
 
int main ()
{
    int * x = NULL;
    for(int i = 1; i <= 10; ++i)
    {
        x = (int *)realloc(x, sizeof(int) * i);
        x[i-1] = i;
    }
    
    for(int i = 0; i < 10; ++i)
        printf("%d ", x[i]);
 
    return 0;
}
1
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
12438 / 7465 / 1749
Регистрация: 25.07.2009
Сообщений: 13,721
18.03.2010, 15:43 15
вот пару недель назад примерно то же самое было: https://www.cyberforum.ru/cpp-... post585091
0
1 / 1 / 1
Регистрация: 05.04.2008
Сообщений: 48
18.03.2010, 16:05  [ТС] 16
fasked спасибо, заработало наконец то
0
18.03.2010, 16:05
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
18.03.2010, 16:05
Помогаю со студенческими работами здесь

Изменение размера динамического массива
вводится числовой массив неизвестной длинны, каждое число заносится в динамический массив. using...

Рекурсивное изменение размера массива
int* resize_array(int* arr, int count_arr, int i) { if (i &lt; count_arr) { arr =...

Изменение размера массива в конструкторе
Создайте класс matrix полем класса будет массив 10 на 10. Конструктор должен позволять программисту...

Изменение размера массива объектов класса с++
Доброго времени суток! Нужно динамически изменить размер массива объектов, когда пользователь хотел...


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

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

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