我正在使用std::ranges(max和max_element) 中的演算法進行投影。結果是否也可能是預計值?目前我必須在回傳值上再次呼叫投影函式。
示例:這里我想要最長字串的大小,但演算法只回傳字串或迭代器。
int main()
{
const std::vector<std::string> vec = {
"foo",
"hello",
"this is a long string",
"bar"
};
//r1 is a string. r2 is an iterator
const auto r1 = std::ranges::max(vec, {}, &std::string::size);
const auto r2 = std::ranges::max_element(vec, {}, &std::string::size);
//I have to call size() again
std::cout << r1 << '\n' << *r2 << '\n';
std::cout << r1.size() << '\n' << r2->size() << std::endl;
}
編譯器資源管理器
uj5u.com熱心網友回復:
您在原始范圍上使用演算法 ( max/ max_element),它只能為您提供一個元素/迭代器到該范圍內。
如果您只想要投影值,請先進行投影(通過 a views::transform)以獲取長度,然后找到其中的最大值
auto const lens = std::views::transform(vec, &std::string::size);
const auto r1 = std::ranges::max(lens);
const auto r2 = std::ranges::max_element(lens);
std::cout << r1 << '\n' << *r2 << '\n'; // prints 21 21
這是一個演示。
正如此答案中所述,std::string::size不允許使用的地址,因此您應該改用 lambda。不過一般來說,基于成員函式的投影效果很好,只要它不是 std 函式。
uj5u.com熱心網友回復:
這里我想要最長字串的大小,但演算法只回傳字串或迭代器。
事實上,根據[namespace.std#6]:
Let
F表示標準庫函式([global.functions])、標準庫靜態成員函式或標準庫函式模板的實體化。除非F被指定為 可尋址函式,否則如果 C 程式顯式或隱式地嘗試形成指向 的指標,則它的行為是未指定的(可能格式錯誤)F。
這是未指定的行為,因為您被禁止提取string::size.
您可以使用views::transform將原始范圍轉換為元素為大小值的范圍,然后取最大值。
auto size = std::ranges::max(
vec | std::views::transform([](auto& s) { return s.size(); }));
std::cout << size << '\n';
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/402510.html
標籤:
上一篇:從編譯時已知的字串中檢索型別
