簡體   English   中英

使用range-v3進行轉換

[英]Transform using range-v3

我正在嘗試使用范圍下面的代碼,但它不起作用。

// Code
std::map<int, std::string> m{ {1,"foo"},{42,"bar"},{7,"baz"} };
std::vector<int> keys;

// without using ranges
std::transform(begin(m), end(m), std::back_inserter(keys), [](auto val)
{
    return val.first;
});

工作正常。 但,

// with using ranges
ranges::transform(m,std::back_inserter(keys), [](auto val)
{
    return val.first;
});

它不適用於范圍嗎?

我正在使用MSVC 2017 15.9.14

range-v3不支持std::back_insert_iterator ,因為它不滿足庫Iterator概念,請參見此問題 正如討論中指出的那樣,這應該在C ++ 20中修復。

您可以通過以下任一方法解決此問題

keys.resize(3);

ranges::transform(m, keys.begin(), [](auto val) { return val.first; });

或者,我認為更可取(因為您可以使keys const ):

const std::vector<int> keys = m |
    ranges::view::transform([](auto val){ return val.first; });

作為附帶說明,請考慮將lambda參數傳遞為const限定的引用,以避免不必要的復制。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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