Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Руслан92
45 / 0 / 0
Регистрация: 10.04.2016
Сообщений: 109
Завершенные тесты: 1
1

Вектор объектов и работа c push_back. Избавьте от копий)

07.02.2019, 12:59. Просмотров 250. Ответов 8

Всем мира!
Ребята, короче хочу реализовать класс, описывающий работу зоомагазина. Делаю для самопрактики, так сказать, разбираюсь в бою что-куда.
Возник вопрос: в функции main() создаю вектор объектов и хочу, чтоб он инициализировался внутри цикла. Метод Push_back(), видимо, мне не подходит, т.к. внутри вектора создаются копии. Посмотрел про emplace_back(), вроде то, что нужно, но все равно создает копии. Там ниже еще попытка реализовать пару<ключ, значение>, но это не по теме, на это не обращайте внимания. Что и как мне сделать, чтоб создались только оригиналы объектов, и чтоб они создались внутри цикла?
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
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
#include "pch.h"
#include "pch.cpp"
 
class petshop {
    char animal[20];
    char name[20];
    char gender[7];
    int cost;
    int count;
public:
    petshop();
    petshop(char *s1, int a) { strcpy(animal, s1); cost = a; }
    petshop(const petshop &ob);
    char set_name(char *s) { strcpy(name, s); }
    void set_name();
    char set_animal(char *s) { strcpy(animal, s); }
    void set_animal();
    char set_gender(char *s) { strcpy(animal, s); }
    void set_gender();
    char set_cost(int a) { cost = a; }
    void set_cost();
    char set_count(int a) { count = a; }
    void set_count();
    void show_all();
    void show_sample();
    char *get_animal() {return this->animal;}
 
    ~petshop();
    };
 
    petshop::petshop()
    {
        char answer[7];
        char r1[20];
        int a;
        cout << "Do you want to enter information now or later? ";
        do {
            cin.clear();
            cin.getline(answer, 7);
        } while ((strcmp(answer, "now") != 0) && (strcmp(answer, "later") != 0));
        if (!strcmp(answer, "later")) {
            strcpy(animal, "");
            strcpy(name, "");
            strcpy(gender, "");
            cost = 0;
            count = 0;
        }
        if (!strcmp(answer, "now")) {
            cout << "What kind of animal you want to write?\n";
            cin >> r1;
            strcpy(animal, r1);
            strcpy(r1, "");
            cout << "What name you want to write?\n";
            cin >> r1;
            strcpy(name, r1);
            strcpy(r1, "");
            cout << "What gender do the animal have?\n";
            cin >> r1;
            strcpy(gender, r1);
            strcpy(r1, "");
            cout << "What is the cost of the animal?\n";
            cin >> a;
            cost = a;
        }
    }
 
    petshop::petshop(const petshop &ob)
    {
        strcpy(this->animal, ob.animal);
        this->cost = ob.cost;
        this->count++;
        char answer[7];
        char r1[20];
        int a;
        cout << "Do you want to enter information now or later? ";
        do {
            cin.clear();
            cin.getline(answer, 7);
        } while ((strcmp(answer, "now") != 0) && (strcmp(answer, "later") != 0));
        if (!strcmp(answer, "later")) {
            strcpy(name, "");
            strcpy(gender, "");
        }
        if (!strcmp(answer, "now")) {
            cout << "What name you want to write?\n";
            cin >> r1;
            strcpy(name, r1);
            strcpy(r1, "");
            cout << "What gender do the animal have?\n";
            cin >> r1;
            strcpy(gender, r1);
            strcpy(r1, "");
        }
    }
 
    void petshop::set_animal() {
        char r1[20];
        cout << "What kind of animal you want to write?\n";
        cin >> r1;
        strcpy(animal, r1);
        strcpy(r1, "");
    }
 
    void petshop::set_name() {
        char r1[20];
        cout << "What name you want to write?\n";
        cin >> r1;
        strcpy(name, r1);
        strcpy(r1, "");
    }
 
    void petshop::set_gender() {
        char r1[20];
        cout << "What gender do the animal have?\n";
        cin >> r1;
        strcpy(gender, r1);
        strcpy(r1, "");
    }
 
    void petshop::set_cost() {
        int a;
        cout << "What is the cost of the animal?\n";
        cin >> a;
        cost = a;
    }
 
    void petshop::set_count() {
        int a;
        cout << "How many animals of that type?";
        cin >> a;
        cost = a;
    }
 
    void petshop::show_sample()
    {
        cout << "Animal: " << animal << '\n';
        cout << "Name: " << name << '\n';
        cout << "Gender: " << gender << '\n';
        cout << "Cost: " << cost << '$' <<'\n';
        cout << "Count: " << count << '\n';
    }
 
    void petshop::show_all()
    {
        cout << "Animal: " << animal << '\n';
        cout << "Cost: " << cost << '$' << '\n';
        cout << "Count: " << count << "\n\n";
    }
 
    petshop::~petshop()
    {
        cout << "You deleted " << animal << " who has name " << name << "\n\n";
    }
 
    int main()
    {
        int N;
        cout << "Enter initial count of animals: ";
        cin >> N;
        petshop *r = new petshop;
        
        vector <petshop> animals;
        map <int, petshop> key1;
        int i;
        for (i = 0; i < N; i++)
        {
            animals.emplace_back(move(*r));
        }
        for (i = 0; i < N; i++)
        {
            key1.insert(pair<int, petshop>(i + 1, animals[i]));
        }
 
        int j;
        cout << "Enter the key: ";
        cin >> j;
 
        map<int, petshop>::iterator p;
        p = key1.find(int(j));
        while (p != key1.end()) {
            p->second.get_animal();
        }
 
        return 0;
    }
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.02.2019, 12:59
Ответы с готовыми решениями:

Немного поясните(вектор, push_back)
Вот вам код, господа #include &lt;iostream&gt; #include &lt;vector&gt; using namespace std; int main() {...

Метод push_back заносит некорректные данные в вектор
Есть структура вида: struct PadStyleDef { std::string name; std::string padShapeType; float...

Как через push_back заполнить вектор векторов?
Как через push_back заполнить вектор векторов? просто вектор например так: for(int...

Как положить в вектор структур значение через push_back
есть вот такой вектор vector&lt;struct&lt;Point&gt;&gt; в структуре point , есть координата икс. struct Point...

Есть вектор пар, как положить туда значение пары через push_back
Есть вот такой вектор vector&lt;vector&lt;pair&lt;int, int&gt;&gt;&gt; number_pair; размер number_pair.size() ...

8
Михаиллллллл
64 / 55 / 13
Регистрация: 16.03.2017
Сообщений: 426
07.02.2019, 13:12 2
создайте внутри скобочек {}, по выходе за }, вектор пропадет
1
Руслан92
45 / 0 / 0
Регистрация: 10.04.2016
Сообщений: 109
Завершенные тесты: 1
07.02.2019, 13:45  [ТС] 3
Что? Не понял, что внутри скобочек?
0
Михаиллллллл
64 / 55 / 13
Регистрация: 16.03.2017
Сообщений: 426
07.02.2019, 14:00 4
Внутри скобочек создавайте переменные.
Пример:
C++ (Qt)
1
2
3
4
{
QVector <int> testVector;
....
}
Этот вектор перестает существовать за скобочками.
Внутри метода заполняйте этот вектор.
Также создавайте внутри метода переменную, после окончания работы метода, переменная пропадет.
1
07.02.2019, 14:00
Руслан92
45 / 0 / 0
Регистрация: 10.04.2016
Сообщений: 109
Завершенные тесты: 1
07.02.2019, 14:40  [ТС] 5
Дак мне надо чтоб вектор все время программы существовал. Там будут если все объекты совершаться с которыми будут какие-либо операции производиться. Че толку от того, что я определю его, заполню и после заполнения сразу удалю. Бред.
0
Михаиллллллл
64 / 55 / 13
Регистрация: 16.03.2017
Сообщений: 426
10.02.2019, 11:12 6
Тогда зачем их создавать внутри цикла?
Создайте в хедере.
1
_stanislav
(50 / 50 || 80 / 20) ?
770 / 622 / 262
Регистрация: 16.08.2014
Сообщений: 2,627
Завершенные тесты: 2
10.02.2019, 11:29 7
Цитата Сообщение от Руслан92 Посмотреть сообщение
и чтоб они создались внутри цикла?
создать вектор определенного размера с объектами сконструированными по умолчанию.
2
SomniPhobia
120 / 93 / 35
Регистрация: 22.11.2017
Сообщений: 345
10.02.2019, 20:46 8
Руслан92, привет!
Тут (ниже) нет копий, пересоздания массива, обслуживаемого экземпляром вектора.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
...
petshop r;
vector <petshop> animals(N);
for (auto &animal : animals)
        {
            animal = r;
        }
map <size_t, petshop> key1;
size_t u = 0u;
for (const auto &animal : animals)
        {
            key1.insert(pair<size_t, petshop>(++u, animal));
        }
...
2
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
7308 / 3561 / 489
Регистрация: 04.12.2011
Сообщений: 10,053
Записей в блоге: 5
10.02.2019, 23:20 9
Руслан92, вектор это ссылка (на контейнер), а память для объектов выделяется в куче. Вопрос: если Вы уже выделили память и имеете указатель, то зачем Вы сохраняете в векторе объект? Не проще ли сохранить указатель? Вообще, существуют смарт пойнтеры и может быть unique_ptr, это именно то. Но поскольку
Цитата Сообщение от Руслан92 Посмотреть сообщение
разбираюсь в бою что-куда
то для практики, можно и руками потом проделетить по вектору освободив память выделенную за его пределами. Тут, - воля Ваша.
1
10.02.2019, 23:20
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.02.2019, 23:20

Создание копий графических объектов
Добрый день. Вопрос общий, хочу попробовать. Есть форма, на ней ComboBox. В нем есть выбор заданных...

Конструктор копий, инициализация объектов
#include &lt;iostream&gt; using namespace std; class myClass { public: myClass() { cout &lt;&lt;...

Поиск копий файлов и удаление найденных копий
Столкнулся с подобным заданием и никак, не могу понять как его решить: Разработать пакетный файл,...


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

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

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