【问题标题】:c++ custom type vector optimizationc++自定义类型向量优化
【发布时间】:2013-02-08 21:27:11
【问题描述】:

我有一个 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

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

【问题讨论】:

  • 该代码不会生成该输出。
  • 准确地说,我认为它因编译器而异。 @BenVoigt
  • 不,我的意思是那个代码不会在任何编译器上打印出-1
  • 为什么不呢?,我发布了真实的输出
  • 对不起,你是对的。我之前编辑了问题做错了。

标签: c++ vector constructor temporary custom-type


【解决方案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 );
}

【讨论】:

  • cc 0 ccc 0 dc 0 cc 1 ccc 1 dc 1
  • 以上是目前的输出。这可以在没有复制构造函数调用的情况下实现吗?
  • @Ian:I don't see a copy constructor call。您确定您按照我的建议使用了emplace_back(i),而不是push_back(A(i))emplace_back(A(i))
猜你喜欢
  • 1970-01-01
  • 2019-05-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-21
相关资源
最近更新 更多