名稱空間
變體
操作

std::experimental::ranges::copy, std::experimental::ranges::copy_if

來自 cppreference.com
< cpp‎ | experimental‎ | ranges
 
 
實驗性
技術規範
檔案系統庫 (檔案系統 TS)
庫基礎 (庫基礎 TS)
庫基礎 2 (庫基礎 TS v2)
庫基礎 3 (庫基礎 TS v3)
並行性擴充套件 (並行性 TS)
並行性擴充套件 2 (並行性 TS v2)
併發性擴充套件 (併發性 TS)
併發擴充套件 2 (併發 TS v2)
概念 (概念 TS)
範圍 (範圍 TS)
反射 (反射 TS)
數學特殊函式 (特殊函式 TR)
實驗性非 TS
模式匹配
線性代數
std::execution
契約
2D 圖形
 
 
 
定義於標頭檔案 <experimental/ranges/algorithm>
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 );
(1) (範圍 TS)
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 );
(2) (範圍 TS)
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{} );
(3) (範圍 TS)
template< InputRange R, WeaklyIncrementable O,

          class Proj = ranges::identity,
          IndirectUnaryPredicate<projected<ranges::iterator_t<R>, Proj>> Pred >
    requires IndirectlyCopyable<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{} );
(4) (範圍 TS)

將源範圍([firstlast)r)中的元素複製到始於 result 的目標範圍,從源範圍的第一個元素開始並進行到最後一個元素。

1) 複製範圍 [firstlast) 中的所有元素。對於每個非負整數 n < (last - first),執行 *(result + n) = *(first + n)。如果 result 在範圍 [firstlast) 內,則行為未定義。在這種情況下,可以使用 ranges::copy_backward 代替。
2)(1),但使用 r 作為源範圍,如同透過 ranges::copy(ranges::begin(r), ranges::end(r), result);,只不過 result 可能不會被複制。
3) 只複製當謂詞 pred 應用於透過投影 proj 投影的元素值時返回 true 的元素。被複制元素的順序保持不變。如果源範圍和目標範圍重疊,則行為未定義。
4)(3),但使用 r 作為源範圍,如同透過 ranges::copy_if(ranges::begin(r), ranges::end(r), result, pred, proj);,只不過 resultpredproj 可能不會被複制。

儘管上述宣告所示,演算法宣告的實際模板引數數量和順序未指定。因此,如果在呼叫演算法時使用顯式模板引數,程式可能不可移植。

目錄

[編輯] 引數

first, last - 要複製的元素範圍
r - 要複製的元素範圍
result - 目標範圍的開頭
pred - 應用於投影元素的謂詞
proj - 應用於元素的投影

[編輯] 返回值

一個 tagged_pair 物件,包含以下兩個成員

  • 第一個成員,帶有標籤 tag::in,是源範圍的越界迭代器(即一個型別為 I 的迭代器,與哨兵 last 比較相等)。
  • 第二個成員,帶有標籤 tag::out,是結果範圍的越界迭代器。

[編輯] 複雜度

1) 恰好 ranges::distance(first, last) 次賦值。
2) 恰好 ranges::distance(r) 次賦值。
3) 恰好 ranges::distance(first, last) 次應用相應的投影和謂詞。
4) 恰好 ranges::distance(r) 次應用相應的投影和謂詞。

[編輯] 可能的實現

第一版
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

[編輯] 參閱

將一個範圍的元素複製到一個新位置
(函式模板) [編輯]
以逆序複製一個範圍的元素
(函式模板) [編輯]
建立一個反轉後的範圍副本
(函式模板) [編輯]
將一定數量的元素複製到一個新位置
(函式模板) [編輯]
給一個範圍的元素賦某個值
(函式模板) [編輯]
複製一個範圍的元素,忽略那些滿足特定條件的元素
(函式模板) [編輯]