У меня есть класс A, и у него есть личный член int _i. Я хочу, чтобы n экземпляров A были сохранены в векторе. Таким образом, я дал начальную емкость для вектора. Также я хочу хранить объекты с разными значениями _i и создавать объекты с разными значениями в цикле. Соответствующий код выглядит следующим образом:
#include <vector>
#include <iostream>
using namespace std;
class A
{
public:
A( int i = -1 ) { _i = i; cout << "cc " << _i << endl; }
A( const A &other ) { _i = other._i; cout << "ccc " << _i << endl; }
~A() { cout << "dc " << _i << endl; }
int get_i() const { return _i; }
private:
int _i;
};
const int n = 2;
vector<A> v( n );
int main()
{
cout << "---" << endl;
for ( int i = 0; i < n; i++ )
v[i] = A( i );
cout << "---" << endl;
for ( int i = 0; i < n; i++ )
cout << v[i].get_i() << endl;
cin.ignore( 1 );
return 0;
}
output:
cc -1
ccc -1
dc -1
cc -1
ccc -1
dc -1
---
cc 0
dc 0
cc 1
dc 1
---
0
1
Я думаю, начальный параметр емкости сначала создает и разрушает объекты без необходимости. И в первом цикле временные объекты также создаются без необходимости. У меня вопрос, как я могу исправить код, чтобы напрямую передавать объекты в вектор без конструкции по умолчанию и временного объекта? Ниже мой желаемый результат:
---
cc 0
cc 1
---
0
1
На самом деле, я не знаю, является ли создание по умолчанию и создание временных объектов проблем с производительностью или нет.
использование reserve
не resize
, чтобы установить емкость. А потом использовать emplace_back
для строительства на месте, чтобы избежать временных.
vector<A> v;
int main()
{
v.reserve(n)
cout << "---" << endl;
for ( int i = 0; i < n; i++ )
v.emplace_back( 1 );
}
Других решений пока нет …