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

Изменение размера динамического массива (resize) - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.70
Donnerwetter
40 / 40 / 12
Регистрация: 04.02.2014
Сообщений: 144
20.05.2014, 08:50     Изменение размера динамического массива (resize) #1
Учусь менять размер динамического массива. Помогите разобраться, пожалуйста. Допустим, есть какая-то структура "читатель библиотеки". Моя цель - увеличить массив читателей на 1 элемент и добавить нового читателя. Застрял на функции добавления. Ну и вообще посмотрите код в целом, думаю, накосячил.

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>
 
using namespace std;
 
struct Reader
{
    int age[99];
    char name[20];
    int ID[100];
};
 
int Resize_Reader_Mas(Reader* readers, int size)//изменение размера массива
{
    Reader* resize_readers = new Reader[size + 1];
    for(int i = 0; i < size; i++)
    {
        resize_readers[i] = readers[i];
    }
    size++;
    readers = resize_readers;
    delete[] resize_readers;
    return size;
}
 
void Add_Reader (Reader* readers, int size)//добавление нового читателя
{
 
}
 
void main()
{
    int size = 0;
    Reader* readers = new Reader [size];
    Resize_Reader_Mas(readers, size);
    Add_Reader (readers, size);
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
zss
Модератор
Эксперт С++
 Аватар для zss
5942 / 5547 / 1783
Регистрация: 18.12.2011
Сообщений: 14,164
Завершенные тесты: 1
20.05.2014, 08:58     Изменение размера динамического массива (resize) #2
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
int Resize_Reader_Mas(Reader* readers, int size)//изменение размера массива
{
    Reader* resize_readers = new Reader[size + 1];
    for(int i = 0; i < size; i++)
    {
        resize_readers[i] = readers[i];
    }
    delete[] readers; // старый не нужен
    size++;
    readers = resize_readers;
    //   delete[] resize_readers;
    return size;
}
Fuga
2 / 2 / 0
Регистрация: 11.05.2011
Сообщений: 62
20.05.2014, 09:00     Изменение размера динамического массива (resize) #3
Цитата Сообщение от zss Посмотреть сообщение
// * delete[] resize_readers;
Закоментил, потому что она локально создается и по завершению функции уничтожается?
zss
Модератор
Эксперт С++
 Аватар для zss
5942 / 5547 / 1783
Регистрация: 18.12.2011
Сообщений: 14,164
Завершенные тесты: 1
20.05.2014, 09:03     Изменение размера динамического массива (resize) #4
Цитата Сообщение от Fuga Посмотреть сообщение
и по завершению функции уничтожается?
Это был ошибочный оператор в исходном коде.
Удаляем старый массив, а адрес нового подставляем вместо адреса старого.
Donnerwetter
40 / 40 / 12
Регистрация: 04.02.2014
Сообщений: 144
20.05.2014, 09:18  [ТС]     Изменение размера динамического массива (resize) #5
zss, с ресайзом понятно, спасибо! А с функцией добавления не поможете? Не могу разобраться, как правильно реализовать этот момент, чтобы каждый новый пользователь добавлялся после предыдущего. Соображения такие: ввести переменную-счетчик пользователей (допустим, какую-то int reader_count), передавать ее в функцию добавления и потом внутри делать цикл for (int i = count_reader + 1;i<size;i++). Это верный алгоритм?
zss
Модератор
Эксперт С++
 Аватар для zss
5942 / 5547 / 1783
Регистрация: 18.12.2011
Сообщений: 14,164
Завершенные тесты: 1
20.05.2014, 10:12     Изменение размера динамического массива (resize) #6
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
void Add_Reader (Reader* readers, int n)//добавление нового читателя
{
       
     cin>>readers[n].age;
     cin>>readers[n].name;
     cin>>readers[n].ID;
}
 
void main()
{
    int size = 10;
    Reader* readers = new Reader [size];
    int ReadersCount=0;
    while(true)
    {
         if(ReadersCount>size)
              Resize_Reader_Mas(readers, ReadersCount+1);
         Add_Reader (readers, ReadersCount);
         ReadersCount++;
    }
}
I_am_Max
0 / 0 / 0
Регистрация: 18.05.2014
Сообщений: 6
20.05.2014, 10:38     Изменение размера динамического массива (resize) #7
C++
1
2
3
4
5
6
7
void Add_Reader (Reader* readers, int size)//добавление нового читателя
{
       
     cin>>readers[size-1].age;
     cin>>readers[size-1].name;
     cin>>readers[size-1].ID;
}
вот так я думаю будет правильнее, так как функция добавлять пользователя в конец списка, а если передавать индекс то функцию следует назвать "изменение читателя"
Donnerwetter
40 / 40 / 12
Регистрация: 04.02.2014
Сообщений: 144
20.05.2014, 10:55  [ТС]     Изменение размера динамического массива (resize) #8
Цитата Сообщение от I_am_Max Посмотреть сообщение
а если передавать индекс то функцию следует назвать "изменение читателя"
Почему же. Ведь индекс будет не один и тот же. После каждого добавления он будет увеличиваться на единицу, поэтому новый читатель будет добавляться на следующую позицию. По-моему, все логично.
I_am_Max
0 / 0 / 0
Регистрация: 18.05.2014
Сообщений: 6
20.05.2014, 11:09     Изменение размера динамического массива (resize) #9
Цитата Сообщение от zss Посмотреть сообщение
C++
1
void Add_Reader (Reader* readers, int n)//добавление нового читателя
если передать не размер массива с читателями, а например 3 то получится что мы просто изменим читателя под номером 3, но не занесем нового в конец списка. Хотя здесь все зависит от логики и предпочтений программиста...
outoftime
║XLR8║
 Аватар для outoftime
505 / 427 / 33
Регистрация: 25.07.2009
Сообщений: 2,297
20.05.2014, 11:39     Изменение размера динамического массива (resize) #10
Donnerwetter, лучше сделать как в std::vector
C++
1
2
3
4
5
6
7
8
9
10
11
12
class array {
public:
    void resize(const size_t& new_size); // меняем size если new_size < capasity
    void add(const int& elem); // a[size++] = elem
    
private:
    void changeCapasity(const size_t& new_capasity); // перевыделяем массив a
    
    size_t capasity;
    size_t size;
    int*   a;
};
Donnerwetter
40 / 40 / 12
Регистрация: 04.02.2014
Сообщений: 144
20.05.2014, 11:44  [ТС]     Изменение размера динамического массива (resize) #11
outoftime, нет, классы пока еще не знаю. Суммируя все вышесказанное, окончательный вариант сделал так:

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
//увеличение размера массива читателей
int Resize_Reader_Mas(Reader* readers, int size)
{
    Reader* resize_readers = new Reader[size + 1];
    for(int i = 0; i < size; i++)
    {
        resize_readers[i] = readers[i];
    }
    if(readers!=NULL)
    delete[]readers;
    size++;
    readers = resize_readers;
    return size;
}
 
//получение информации о читателе
Reader Get_Reader()
{
    Reader reader;
    cout<<"Enter reader ID: \n";
    cin>>*reader.ID;
    cout<<"\nEnter reader name: \n";
    cin>>*reader.name;
    cout<<"Enter reader age: \n";
    cin>>*reader.age;
    return reader;
}
 
//добавление читателя
void Add_Reader (Reader*& readers, int& size)
{
    Resize_Reader_Mas(readers, size);
    readers[size-1] = Get_Reader();
}
Всем спасибо!
outoftime
║XLR8║
 Аватар для outoftime
505 / 427 / 33
Регистрация: 25.07.2009
Сообщений: 2,297
20.05.2014, 12:46     Изменение размера динамического массива (resize) #12
Цитата Сообщение от Donnerwetter Посмотреть сообщение
Суммируя все вышесказанное
Я своим постом хотел показать что выделять новую память каждый раз когда надо добавить элемент в коллекцию - плохо! Поэтому держат дополнительный параметр - capasity, который указывает реальный размер массива, а size указывает количество элементов в массиве. Так вот, перевыделять память надо только если size > capasity, т.е. когда памяти для добавления элемента не хватает.

Цитата Сообщение от Donnerwetter Посмотреть сообщение
нет, классы пока еще не знаю.
Покажу пример на структуре.

Donnerwetter,
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
struct Reader {
    char* ID;
    char* name;
    uint8_t age;
    Reader Read() {
        std::cout << "Enter ID name age: ";
        std::cin >> ID >> name >> age;
    }
};
 
struct Array {
    size_t capasity;
    size_t size;
    Reader* array;
    
    Array(const size_t& default_capacity = 10) {
        capasity = default_capacity;
    }
    
    void add(const Reader& reader) {
        if (size >= capasity)
            resize(capasity * 1.6);
 
        array[size++] = reader;
    }
    
    void resize(const size_t& value) {
        if (value > capasity) {
            // выделяем память под новый массив и копируем данные
        } else {
            // обрезаем массив до заданных размеров
        }
    }
};
Donnerwetter
40 / 40 / 12
Регистрация: 04.02.2014
Сообщений: 144
20.05.2014, 13:31  [ТС]     Изменение размера динамического массива (resize) #13
outoftime, спасибо за пример и совет, буду разбираться
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.05.2014, 20:41     Изменение размера динамического массива (resize)
Еще ссылки по теме:

C++ Double free or corruption при изменении размера динамического массива
Определение размера динамического массива строк C++
Изменение размера динамического массива объектов класса C++

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

Или воспользуйтесь поиском по форуму:
Fuga
2 / 2 / 0
Регистрация: 11.05.2011
Сообщений: 62
20.05.2014, 20:41     Изменение размера динамического массива (resize) #14
Цитата Сообщение от outoftime Посмотреть сообщение
Покажу пример на структуре.
А теперь пожалуйста покажи, как сие использовать =)
Yandex
Объявления
20.05.2014, 20:41     Изменение размера динамического массива (resize)
Ответ Создать тему
Опции темы

Текущее время: 22:56. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru