正如@jalf說,地圖和摺疊已經在標準中,隱藏不同的名字後面:
- 地圖 - >
std::transform
,在標頭中找到<algorithm>
- 倍 - >
std::accumulate
,在報頭<numeric>
發現
許多更多功能的東西可以在Boost.Range,這是一個非常棒的圖書館。尤其是range adaptors給人一種真實的功能感,因爲他們在其他範圍內創建了視圖。通過C++ 11,可以通過lambdas輕鬆創建可能的謂詞。
Boost.Optional可能是您的「選項類型」,具體取決於您的意思。
C++中的不變性可以通過簡單地聲明對象const
來實現。您可以避免使用通過參考參數傳遞的副本。真相被告知,這當然不等於真正的功能不可變性,因爲函數式語言中的不可變容器可以被複制,但是你想要的並且通常只是共享內部表示。畢竟,如果你從不寫,寫入時拷貝是非常棒的。
在你的託管指針上,我不知道你是什麼意思。在C++中,通常根本不需要指針或動態分配的對象。只需創建它們「堆疊」:Foo obj;
。
如果您的意思是共享所有權,那麼有std::shared_ptr
。甚至有一個很好的範圍適配器,如果你存儲這種指針的容器:
#include <boost/range/adaptor/indirected.hpp>
#include <boost/range/algorithm/generate.hpp>
#include <boost/range/algorithm/copy.hpp>
#include <vector>
#include <memory>
#include <algorithm>
#include <iterator>
#include <iostream>
int main(){
std::vector<std::shared_ptr<int>> v(5);
int i = 0;
boost::generate(v, [&i]{ return std::make_shared<int>(i++); });
boost::copy(v | boost::adaptors::indirected,
std::ostream_iterator<int>(std::cout));
}
你的具體例子
my_list.map(f).filter(p).head_opt.get_or_else("not found")
可能是這樣的(注實現即std::vector
是C++中的默認容器):
// Warning, C++11 only!
// Boost.Range doesn't like lambdas without this:
#define BOOST_RESULT_OF_USE_DECLTYPE
#include <vector>
#include <string>
#include <iterator>
#include <iostream>
#include <boost/optional.hpp>
#include <boost/range/adaptor/filtered.hpp>
#include <boost/range/adaptor/transformed.hpp>
#include <boost/range/algorithm/generate.hpp> // only needed for filling the vector
#include <boost/range/algorithm/copy.hpp> // only needed for printing
// we need a little helper for the optional stuff
struct head_opt_gen{} head_opt; // just a tag type
template<class Range>
auto operator|(Range const& r, head_opt_gen)
-> boost::optional<decltype(r.front())>
{
if(r.empty())
return boost::none;
return r.front();
}
int main(){
using namespace boost::adaptors;
std::vector<int> v(5);
int i = 0;
boost::generate(v, [&]()->int{ ++i; return i*i; });
// first, without the optional stuff
boost::copy(v | transformed([](int x){ return std::to_string(x); })
| filtered([](std::string const& s){ return s.size() > 1; }),
std::ostream_iterator<std::string>(std::cout, "\n"));
std::cout << "=====================\n";
// now with
std::cout << boost::get_optional_value_or(
v | transformed([](int x){ return std::to_string(x); })
| filtered([](std::string const& s){ return s.size() > 2; }) // note: > 2
| head_opt, "none");
}
與鏘3.1中繼線編譯,這導致下面的輸出:
16
25
=====================
none
來源
2012-02-25 00:22:00
Xeo
順便說一下,C++有一個垃圾收集器。不過,不是標準的一部分。 – 2012-02-24 23:49:24
C++標準庫具有基本上是地圖和摺疊的功能。他們只是被稱爲'std :: transform'和'std :: accumulate'。 Boost有一個選項類型。我不確定你的意思是「託管指針」雖然 – jalf 2012-02-24 23:51:58
@jalf我正在尋找像'my_list.map(f).filter(p).head_opt.get_or_else(「not found」)',其中my_list是一個int的可迭代容器,f是一個從int到std :: string的函數,p是一個用於選擇字符串子集的謂詞,head_opt返回表示列表中第一個的選項,最後get_or_else是典型的函數on一個Option類型,它返回一個Some的內容,或一個None的給定值 – 2012-02-25 00:10:11