使用std :: transform最终向量保持为空

问题描述 投票:0回答:1

我不经常使用std :: transform,但是我发现它非常有用,并且我开始用这种算法替换一些for循环。

这里怎么了?我想保留向量vec中所有代码> 100的元素。我希望有一个新的std :: vector,其中包含3个元素:133、144和155。但是在算法之后,大小为0。 ?

 TEST_CASE("testing trasf1", "[tras1]") {

    std::vector<Test2> vec {
            {1,1},
            {3,3},
            {11,11},
            {12,12},
            {133,133},
            {19,19},
            {21,21},
            {22,22},
            {23,23},
            {144,144},
            {155,155}

    };

    std::vector<uint32_t> final_v {};
    final_v.reserve(vec.size());

    transform(begin(vec), end(vec), begin(final_v), [] (const Test2& elem) {
        if ( elem.getCode() > 100)
            return elem.getCode();
    });

    //REQUIRE(final.size() == 3);

    cout << final_v.size() << endl;

    for (const auto i : final_v) {
        cout << i << endl;
    }

}
c++ stl c++14
1个回答
1
投票

[transform不会在输出序列中插入元素,它只是写入*iter并递增迭代器。

如果要插入到序列中,请使用std::back_inserter(final)作为输出迭代器。

或者,首先调用final.resize(vec.size()),将输出向量设置为正确的大小。请注意,这会将矢量元素初始化为零,因此,对于大矢量,将产生明显的时间开销。

© www.soinside.com 2019 - 2024. All rights reserved.