Advertisement
NickAndNick

std::vector и push_back, emplace_back

Jun 13th, 2022
841
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.80 KB | None | 0 0
  1. #include <iostream>
  2. #include <iomanip>
  3. #include <string>
  4. #include <vector>
  5. using namespace std;
  6. class Person {
  7. public:
  8.     Person() : id(0), salary(0), name("-") {
  9.         puts("Call Person()");
  10.     };
  11.     Person(const int id, const double salary, const string& name)
  12.         : id(id), salary(salary), name(name) {
  13.         puts("Call Person(const int& id, const double& salary, const string& name)");
  14.         ++copying;
  15.     }
  16.     Person(const Person& p)
  17.         : id(p.id), salary(p.salary), name(p.name) {
  18.         puts("Call Person(const Person& p)");
  19.         ++copying;
  20.     }
  21.     ~Person() {
  22.         puts("Call ~Person()");
  23.         if (this->id) cout << "\t" << *this << '\n';
  24.         cout << "\tCopying: " << copying << '\n';
  25.         cout << "\tMoving: " << moving << '\n';
  26.         cout << "\tDestruction: " << ++destruction << '\n';
  27.     }
  28.     // Закомментировать два конструктора и перекомпилировать
  29.     Person(int&& id, double&& salary, string&& name)
  30.         : id(id), salary(salary), name(move(name)) {
  31.         puts("Call Person(int&& id, double&& salary, string&& name)");
  32.      ++moving;
  33.     }
  34.     Person(Person&& p)
  35.         : id(p.id), salary(p.salary), name(move(p.name)) {
  36.         puts("Call Person(Person&& p)");
  37.      ++moving;
  38.     }
  39. private:
  40.     int id;
  41.     double salary;
  42.     string name;
  43.     static unsigned copying;
  44.     static unsigned moving;
  45.     static unsigned destruction;
  46.     friend ostream& operator<<(ostream& out, const Person& p) {
  47.         return out << p.id << ' ' << left << setw(16) << p.name << ' ' << p.salary;
  48.     }
  49. };
  50. unsigned Person::copying = 0U;
  51. unsigned Person::moving = 0U;
  52. unsigned Person::destruction = 0U;
  53. Person sidorov() {
  54.     return { 28042, 128304.02, "Sidorov S. P."s };
  55. }
  56. Person antonov() {
  57.     return { 28063, 173589.13, "Antonov G. N." };
  58. }
  59. int main() {
  60.     const char* s = "--------------------------------";
  61.     vector<Person> persons;
  62.     Person ivanov{ 28074, 147235.26, "Ivanov I. G."s };
  63.     Person petrov{ 28055, 152477.29, "Petrov A. V." };
  64.     persons.emplace_back(ivanov); // 1
  65.     persons.emplace_back(petrov); // 2
  66.     puts(s);
  67.     persons.emplace_back(antonov()); // 3
  68.     persons.emplace_back(sidorov()); // 4
  69.     puts(s);
  70.     persons.emplace_back(28002, 140038.07, "Gavrilov A. A."s); // 5
  71.     persons.emplace_back(28104, 122033.48, "Tarasov S. Z."); // 6
  72.     puts(s);
  73.     persons.push_back({ 28127, 104305.07, "Stepanov D. O."s }); // 7
  74.     persons.push_back({ 28099, 137011.22, "Prokhorov F. I." }); // 8
  75.     puts(s);
  76.     int id = 28111;
  77.     double salary = 161304.58;
  78.     string zakharov = "Zakharov U.L.";
  79.     persons.push_back({ id, salary, zakharov }); // 9
  80.     persons.emplace_back(id, salary, zakharov); // 9
  81.     puts(s);
  82.     Person Zakharov{ id, salary, zakharov }; // 9
  83.     persons.push_back(Zakharov);
  84.     persons.emplace_back(Zakharov);
  85.     puts(s);
  86.     Person empty; // 10
  87.     puts(s);
  88.     for (const auto& record : persons) cout << record << '\n';
  89.     puts(s);
  90.     empty.~Person();
  91.     puts(s);
  92.     system("pause > nul");
  93. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement