簡體   English   中英

使用 std::transform 最終向量保持為空

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM