c – 未知容器的尺寸
我一直在閱讀,使用這個程式碼不是很好:
std::vector<T> my_vector; ... std::sort(my_vector.begin(), my_vector.end());
最好把它寫成:
std::vector<T> my_vector; ... std::sort(std::begin(my_vector), std::end(my_vector));
因為std :: begin將使用包含正常陣列的所有容器.
對於包含正常陣列的所有容器,my_vector.size()的替代方法是什麼?
實際使用std :: begin(my_vector)不是正確的事!如果你想拿起你寧願使用的定製點
using std::begin; using std::end; std::sort(begin(cont), end(cont));
這種方法嘗試使用ADL找到begin(cont),並且當找不到合適的versio時,回退使用std :: begin.
可悲的是,沒有std :: size作為std :: begin這樣的定製點的預設值.它可以使用std :: distance():
std::distance(begin(cont), end(cont));
然而,對於典型的基於節點的容器,或者更一般地,對於非隨機訪問迭代器,這種方法將行進元素,而不是從儲存的值獲得大小.因此,我想你想要呼叫cont.size().定義一個合適的定製點是比較直接的:
namespace util { template <typename C> typename C::difference_type size(C const& c) { return c.size(); } template <typename T, std::size_t N> std::size_t size(T const(&)[N]) { return N; } }
正如在註釋中指出的那樣,在ofollow,noindex" target="_blank">working paper for C++17 中添加了一個非成員大小()函式(參見24.3 [iterator.synoposis]中的簡要說明)的底部).N4280 是提出改革的論文.本文還提出了還添加了函式empty()和data().所有這些功能都在<iterator>中宣告.
新增到C 17的版本在返回型別中直接使用size()成員的decltype().另外它宣告函式是constexpr:
template <typename C> constexpr auto size(C const& c) -> decltype(c.size()) { return c.size(); }
程式碼日誌版權宣告:
翻譯自:http://stackoverflow.com/questions/33329031/size-of-unknown-container