C++ c++;自定义类型向量优化

C++ c++;自定义类型向量优化,c++,vector,constructor,temporary,custom-type,C++,Vector,Constructor,Temporary,Custom Type,我有一个A类,它有一个私有的int_I成员。我想要n个实例存储在一个向量中。因此,我给了向量一个初始容量。此外,我希望保持具有不同_i值的对象,并在循环中构造具有不同值的对象。相应代码如下: #include <vector> #include <iostream> using namespace std; class A { public: A( int i = -1 ) { _i = i; cout << "cc " << _i

我有一个A类,它有一个私有的int_I成员。我想要n个实例存储在一个向量中。因此,我给了向量一个初始容量。此外,我希望保持具有不同_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

实际上,我不知道deafult和临时对象创建是否暴露了性能问题。

使用
保留
,而不是
调整大小
,来设置容量。然后使用
emplace_back
进行就地施工,以避免出现临时情况

vector<A> v;

int main()
{
    v.reserve(n)
    cout << "---" << endl;

    for ( int i = 0; i < n; i++ )
        v.emplace_back( 1 );
}
向量v; int main() { v、 储备(n)
不能使用
保留
,而不是
调整大小
,以设置容量。然后使用
安置(U back)
进行就地施工,以避免临时性的施工

vector<A> v;

int main()
{
    v.reserve(n)
    cout << "---" << endl;

    for ( int i = 0; i < n; i++ )
        v.emplace_back( 1 );
}
向量v; int main() { v、 储备(n)
难道那个代码不会生成那个输出吗?准确地说,我认为它随编译器的不同而不同。@BenVoigtNo,我的意思是,代码不会在任何编译器上打印出
-1
。为什么不呢?我发布了real OutputSry,你是对的。我之前编辑的问题做得不对。那个代码不会生成那个输出。准确地说,我认为它随编译器的不同而不同。@BenVoigtNo,我的意思是代码不会在任何编译器上打印出
-1
。为什么不呢?我发布了real OutputSry,你是对的。我在上一篇文章中编辑了错误的问题。cc 0 ccc 0 dc 0 ccc 1 ccc 1 dc 1以上是现在的输出。这可以在没有复制构造函数调用的情况下进行吗?@Ian:。你确定你使用了
emplace\u back(I)
按照我的建议,而不是
向后推(A(I))
向后推(A(I))
?现在输出的是cc 0 ccc 0 dc 0 cc 1 ccc 1 dc 1Above。这可以不用复制构造函数调用吗?@Ian:。你确定你按照我的建议使用了
向后推(I)
,而不是
向后推(A(I))
向后推(A(I)吗)