Форум программистов, компьютерный форум CyberForum.ru

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 101, средняя оценка - 4.68
softrix
0 / 0 / 0
Регистрация: 05.04.2008
Сообщений: 48
#1

Изменение размера массива - C++

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

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

int *pi = new int[10];

А нужно увеличить +1 элемент, не потеряв предыдущих данных ?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
kazak
3032 / 2353 / 155
Регистрация: 11.03.2009
Сообщений: 5,401
18.03.2010, 03:02     Изменение размера массива #2
Копируешь массив во временный, освобождаешь память, выделяешь по новой нужного размера, копируешь из временного обратно в основной, удаляешь временный.
softrix
0 / 0 / 0
Регистрация: 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)));
 
}
oxotnik
1586 / 1063 / 33
Регистрация: 21.08.2008
Сообщений: 4,545
Записей в блоге: 1
18.03.2010, 14:20     Изменение размера массива #4
Цитата Сообщение от softrix Посмотреть сообщение
Скажите а такой подход не верен?
не верен
rangerx
1931 / 1540 / 141
Регистрация: 31.05.2009
Сообщений: 2,905
18.03.2010, 14:29     Изменение размера массива #5
А нужно увеличить +1 элемент, не потеряв предыдущих данных ?
использовать std::vector.
fasked
Эксперт С++
4933 / 2513 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 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.
Но этот вариант конечно самый благоразумный
softrix
0 / 0 / 0
Регистрация: 05.04.2008
Сообщений: 48
18.03.2010, 14:51  [ТС]     Изменение размера массива #7
fasked:

Спасибо за пример, а без использования библиотеки std, как можно сделать ?
fasked
Эксперт С++
4933 / 2513 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
18.03.2010, 14:52     Изменение размера массива #8
Цитата Сообщение от softrix Посмотреть сообщение
Спасибо за пример, а без использования библиотеки std, как можно сделать ?
Сейчас на Си накатаю =)
softrix
0 / 0 / 0
Регистрация: 05.04.2008
Сообщений: 48
18.03.2010, 14:54  [ТС]     Изменение размера массива #9
Спасибо, а то проблема в том, что эта функция будет в dll, которую я буду к java подключать, не уверен, что данные из вектора смогу нормально в яву передать.
Evg
Эксперт CАвтор FAQ
17413 / 5651 / 355
Регистрация: 30.03.2009
Сообщений: 15,476
Записей в блоге: 26
18.03.2010, 14:58     Изменение размера массива #10
Цитата Сообщение от softrix Посмотреть сообщение
Скажите а такой подход не верен?
Нет, то что выделено через new нельзя перевыделять через realloc. Разработчики Си++ слишком увлеклись и не предусмотрели человеческого варианта перевыделения памяти средствами языка. Поэтому проще всего с такой памятью работать с malloc/realloc/free, а не с new/delete
fasked
Эксперт С++
4933 / 2513 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 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);
}
Evg
Эксперт CАвтор FAQ
17413 / 5651 / 355
Регистрация: 30.03.2009
Сообщений: 15,476
Записей в блоге: 26
18.03.2010, 15:11     Изменение размера массива #12
В первом примере строки 44-48 смело нужно заменять на realloc и не извращаться
softrix
0 / 0 / 0
Регистрация: 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 );
fasked
Эксперт С++
4933 / 2513 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 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;
}
easybudda
Эксперт С++
9456 / 5469 / 927
Регистрация: 25.07.2009
Сообщений: 10,495
18.03.2010, 15:43     Изменение размера массива #15
вот пару недель назад примерно то же самое было: http://www.cyberforum.ru/cpp-beginne...tml#post585091
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.03.2010, 16:05     Изменение размера массива
Еще ссылки по теме:

Изменение размера динамического массива объектов класса C++
Изменение размера массива C++
C++ Изменение размера динамического массива
C++ Изменение размера матрицы
C++ Изменение размера строки

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

Или воспользуйтесь поиском по форуму:
softrix
0 / 0 / 0
Регистрация: 05.04.2008
Сообщений: 48
18.03.2010, 16:05  [ТС]     Изменение размера массива #16
fasked спасибо, заработало наконец то
Yandex
Объявления
18.03.2010, 16:05     Изменение размера массива
Ответ Создать тему
Опции темы

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