带有自定义函数的c ++向量构造函数

时间:2018-05-24 21:50:41

标签: c++ c++11 vector

我目前正在使用一小段代码,我想获取一个向量的每个值并调用一个包装类并放入一个新的向量。

vector<MyClass> input;
vector<WrapperClass> output;
output.reserve(input.size());
for (auto& myclass: input) {
    output.emplace_back(WrapperClass(myclass));
}

我知道上述内容并非明显可读性,但可能如下所示:

vector<WrapperClass> output(input.begin(), input.end(), WrapperAllocator)

我不太清楚分配器应该做什么以及因为我不熟悉&#34; C ++概念&#34;很多文档都在我的头上。也许这是错误的用例,但问题真的归结为;

是否可以在数据从一个容器传递到另一个容器时对其进行转换?如果可能的话,该如何处理?

2 个答案:

答案 0 :(得分:2)

  

是否有可能在数据从一个容器传递到另一个容器时对其进行转换?

如果您的WrapperClass包含MyClass的构造函数,则可以直接从范围创建另一个向量,并在该构造函数中转换数据,例如:

#include <iostream>
#include <vector>

struct MyClass
{
    int x;
    MyClass(int x) : x{ x } {}
};

struct WrapperClass
{
    int x;
    WrapperClass(MyClass const &mc) 
    {
        x = mc.x + 10;
    }
};


int main()
{
    std::vector<MyClass> v1 = { 1,2,3,4 };
    std::vector<WrapperClass> v2(v1.begin(), v1.end());


    //test
    for (auto wc : v2)
        std::cout << wc.x << std::endl;

    return 0;
} 

演示:https://ideone.com/6MFd2s

11
12
13
14

答案 1 :(得分:0)

您可以使用std::transformstd::back_inserter

std::transform( input.begin(), input.end(), std::back_inserter( output ),
   []( const MyClass& c ){ return WrapperClass(c); } );