![](/img/trans.png)
[英]std::vector<unsigned char> remains empty after reading binary file using std::ifstream
[英]using std::transform the final vector remains empty
我不經常使用 std::transform,但是我發現它非常有用,我開始用這個算法替換一些 for 循環。
這里有什么問題? 我想保留所有代碼 > 100 的向量 vec 元素。我希望有一個新的 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())
,將輸出向量設置為正確的大小。 請注意,這會將向量元素初始化為零,因此對於大向量將產生明顯的時間開銷。
在一個操作中進行過濾和轉換:
template<class Container>
struct optional_inserter_iterator: std::back_insert_iterator //convenience
{
using std::back_insert_iterator::*;
optional_inserter_iterator(Container &c) : std::back_insert_iterator(c)
{}
optional_inserter_iterator & operator=(std::optional<Container::value_type> &&opt)
{
if(opt)
std::back_insert_iterator::operator=(*std::move(opt))
return *this;
}
}
在轉換中使用它並讓您的 lambda 返回一個可選的
(未經測試)
編輯:有一些理由不從std::back_insert_iterator
繼承。 如果有人對真正正確的版本感興趣,我可以做一個。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.