std::experimental::ranges::copy, std::experimental::ranges::copy_if
定義於標頭檔案 <experimental/ranges/algorithm> |
||
template< InputIterator I, Sentinel<I> S, WeaklyIncrementable O > requires IndirectlyCopyable<I, O> |
(1) | (範圍 TS) |
template< InputRange R, WeaklyIncrementable O > requires IndirectlyCopyable<ranges::iterator_t<R>, O> |
(2) | (範圍 TS) |
template< InputIterator I, Sentinel<I> S, WeaklyIncrementable O, class Proj = ranges::identity, |
(3) | (範圍 TS) |
template< InputRange R, WeaklyIncrementable O, class Proj = ranges::identity, |
(4) | (範圍 TS) |
將源範圍([
first,
last)
或 r)中的元素複製到始於 result 的目標範圍,從源範圍的第一個元素開始並進行到最後一個元素。
[
first,
last)
中的所有元素。對於每個非負整數 n < (last - first)
,執行 *(result + n) = *(first + n)。如果 result 在範圍 [
first,
last)
內,則行為未定義。在這種情況下,可以使用 ranges::copy_backward 代替。儘管上述宣告所示,演算法宣告的實際模板引數數量和順序未指定。因此,如果在呼叫演算法時使用顯式模板引數,程式可能不可移植。
目錄 |
[編輯] 引數
first, last | - | 要複製的元素範圍 |
r | - | 要複製的元素範圍 |
result | - | 目標範圍的開頭 |
pred | - | 應用於投影元素的謂詞 |
proj | - | 應用於元素的投影 |
[編輯] 返回值
一個 tagged_pair
物件,包含以下兩個成員
- 第一個成員,帶有標籤
tag::in
,是源範圍的越界迭代器(即一個型別為I
的迭代器,與哨兵 last 比較相等)。 - 第二個成員,帶有標籤
tag::out
,是結果範圍的越界迭代器。
[編輯] 複雜度
[編輯] 可能的實現
第一版 |
---|
template<InputIterator I, Sentinel<I> S, WeaklyIncrementable O> requires IndirectlyCopyable<I, O>() ranges::tagged_pair<tag::in(I), tag::out(O)> copy(I first, S last, O result) { for (; first != last; ++first, (void)++result) *result = *first; return {first, result}; } |
第二版 |
template<InputRange R, WeaklyIncrementable O> requires IndirectlyCopyable<ranges::iterator_t<R>, O>() ranges::tagged_pair<tag::in(ranges::safe_iterator_t<R>), tag::out(O)> copy(R&& r, O result) { return ranges::copy(ranges::begin(r), ranges::end(r), result); } |
第三版 |
template<InputIterator I, Sentinel<I> S, WeaklyIncrementable O, class Proj = ranges::identity, IndirectUnaryPredicate<projected<I, Proj>> Pred> requires IndirectlyCopyable<I, O>() ranges::tagged_pair<tag::in(I), tag::out(O)> copy_if(I first, S last, O result, Pred pred, Proj proj = Proj{}) { for (; first != last; ++first) if (ranges::invoke(pred, ranges::invoke(proj, *first))) { *result = *first; ++result; } return {first, result}; } |
第四版 |
template<InputRange R, WeaklyIncrementable O, class Proj = ranges::identity, IndirectUnaryPredicate<projected<ranges::iterator_t<R>, Proj>> Pred> requires IndirectlyCopyable<ranges::iterator_t<R>, O>() ranges::tagged_pair<tag::in(ranges::safe_iterator_t<R>), tag::out(O)> copy_if(R&& r, O result, Pred pred, Proj proj = Proj{}) { return ranges::copy_if(ranges::begin(r), ranges::end(r), result, pred, proj); } |
[編輯] 示例
以下程式碼使用 copy 將一個 vector 的內容複製到另一個 vector 並顯示結果 vector
#include <experimental/ranges/algorithm> #include <experimental/ranges/iterator> #include <iostream> #include <numeric> #include <vector> int main() { // see https://cppreference.tw/w/cpp/language/namespace_alias namespace ranges = std::experimental::ranges; std::vector<int> from_vector(10); std::iota(from_vector.begin(), from_vector.end(), 0); std::vector<int> to_vector; ranges::copy_if(from_vector.begin(), from_vector.end(), ranges::back_inserter(to_vector), [](const auto i) { return i % 3; }); // or, alternatively, // std::vector<int> to_vector(from_vector.size()); // std::copy(from_vector, to_vector.begin()); std::cout << "to_vector contains: "; ranges::copy(to_vector, ranges::ostream_iterator<int>(std::cout, " ")); std::cout << '\n'; }
輸出
to_vector contains: 1 2 4 5 7 8
[編輯] 參閱
(C++11) |
將一個範圍的元素複製到一個新位置 (函式模板) |
以逆序複製一個範圍的元素 (函式模板) | |
建立一個反轉後的範圍副本 (函式模板) | |
將一定數量的元素複製到一個新位置 (函式模板) | |
給一個範圍的元素賦某個值 (函式模板) | |
複製一個範圍的元素,忽略那些滿足特定條件的元素 (函式模板) |