我不经常使用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;
}
}
[transform
不会在输出序列中插入元素,它只是写入*iter
并递增迭代器。
如果要插入到序列中,请使用std::back_inserter(final)
作为输出迭代器。
或者,首先调用final.resize(vec.size())
,将输出向量设置为正确的大小。请注意,这会将矢量元素初始化为零,因此,对于大矢量,将产生明显的时间开销。