假設我有一個類
struct Foo {double x; double y; }
而std::vector<Foo> xy;
我也有一個函式來拉出x成員:
std:: vector<double> bar(const std::vector< Foo> & xy)。
這是對xy的每個元素進行回圈。
是否有辦法使用C 標準庫,以便我可以避免顯式的for回圈?
uj5u.com熱心網友回復:
你可以使用std::transform。例如:
std:: vector<double> bar(const std::vector<Foo> & xy){
std::vector<double> rt;
rt.reserve(xy.size()。
std::transform(std::begin(xy)。
std::end(xy)。
std::back_inserter(rt)。
[](const Foo& f) { return f.x; }) 。
return rt;
為了比較,這里是使用基于范圍的for回圈的版本。由于@463035818_is_not_a_number commented它需要更少的輸入。
std:: vector<double> foo(const std::vector<Foo> & xy){
std::vector<double> rt;
rt.reserve(xy.size()。
for (auto const & f : xy) rt.push_back(f.x)。
return rt;
uj5u.com熱心網友回復:
使用C 20的范圍提供了一個比std::transform更簡短的選擇:
std::vector<double> filtered;
filtered.reserve(xy.size()。
std::range::copy(
std::range::views::transform(xy, &Foo::x)。
std::back_inserter(filtered))。
或者,正如@StoryTeller所指出的,作為init-empty-and-back-insert的另一種更簡短的方法,使用視圖直接初始化filtered向量(這種方法將允許它是const):
auto view = xy | std::ranges::view::transform(&Foo::x)。
std::vector<double> const filtered(view.begin(),view.end())。
uj5u.com熱心網友回復:
好吧,在幕后,顯然有一個回圈的地方。所以在我看來,STL包含了for_each,正是為了解決這種型別的問題。
我們可以這樣撰寫Bar函式:
#include <algorithm>/span>
auto Bar (const std::vector<Foo> & xy)
{
std::vector<double> bar。
auto extract_x = [&](const Foo & f){bar.push_back(f.x);};
std::for_each(xy.begin(), xy.end(), extract_x) 。
return bar。
}
通過移除auto,我們也可以用c 11來做這個。Demo
然而,我同意這里其他人的觀點,即這似乎并不比普通的舊回圈更有用。也許它在某些現實世界的場景中更有用--但我想不出來。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/314109.html
標籤:
上一篇:c 11:為什么靜態constexpr的類內初始化不是定義?
下一篇:如何區分ascii值和數字?
