使用构造函数更改向量类型?

时间:2019-01-10 15:53:26

标签: c++ optimization vector

我有一个充满整数的向量。我有一个采用整数作为构造函数的类。我想使用第一个向量中的值作为每个向量的构造函数来创建一个充满此类的新向量。

我觉得我目前的方法可以大大优化。

vector<int> integers = /*something...*/;

vector<clazz> clazzes();
for(auto& n : integers)
{
    clazzes.emplace_back(clazz(n));
}

2 个答案:

答案 0 :(得分:11)

std::vector中的a constructor接受范围并允许用户定义转换。这就是您需要的:

template< class InputIt >
vector( InputIt first, InputIt last, 
    const Allocator& alloc = Allocator() );

完整程序:

#include <vector>
#include <iostream>

struct Wrapper
{
    int value;
    Wrapper(int n) : value(n) {}
};

int main()
{
    std::vector<int> integers = {0, 1};
    std::vector<Wrapper> wrapped{begin(integers), end(integers)};
    std::cout << wrapped[1].value << '\n';
}

Live demo

这不是特别优化的方法,但是它使代码更少,错误更少,wtf / line更少。哪个好(TM)。

答案 1 :(得分:-1)

您拥有的东西是合理的(尽管请参见YSC's answer,以获得更好的方法)。一个简单的改进是保留所需的存储,因此emplace_back()永远不需要重新分配:

std::vector<clazz> clazzes;
clazzes.reserve(integers.size());  // <-- HERE
for(auto& n : integers)
{
    clazzes.emplace_back(clazz(n));
}