C++修改序列操作-复制(copy;copy_n;copy_if;copy_backward)

一、copy

头文件algorithm

template 
  OutputIterator copy (InputIterator first, InputIterator last, OutputIterator result);

复制元素范围

将[first,last]范围内的元素复制到从result开始的范围内。

该函数将迭代器返回到目标范围的末尾(指向复制的最后一个元素后面的元素)。

范围不应以结果指向[first,last]范围内的元素的方式重叠。 对于此类情况,请参阅copy_backward。

此函数模板的行为等效于:

template
  OutputIterator copy (InputIterator first, InputIterator last, OutputIterator result)
{
  while (first!=last) {
    *result = *first;
    ++result; ++first;
  }
  return result;
}

参数

  1. first,last
    将迭代器输入到要复制的序列中的初始位置和最终位置。 使用的范围是[first,last),它包含first和last之间的所有元素,包括first指向的元素,但不包括last指向的元素。
  2. result
    将迭代器输出到目标序列中的初始位置。这不应指向[first,last]范围内的任何元素。

返回值

到目标范围末尾的迭代器,其中元素已被复制。

// copy algorithm example
#include      // std::cout
#include     // std::copy
#include        // std::vector

int main () {
  int myints[]={10,20,30,40,50,60,70};
  std::vector myvector (7);

  std::copy ( myints, myints+7, myvector.begin() );

  std::cout << "myvector contains:";
  for (std::vector::iterator it = myvector.begin(); it!=myvector.end(); ++it)
    std::cout << ' ' << *it;

  std::cout << '\n';

  return 0;
}

在这里插入图片描述

例外

如果元素赋值或迭代器上的操作抛出,则抛出。请注意,无效参数会导致未定义的行为。

二、copy_n

头文件algorithm

template 
  OutputIterator copy_n (InputIterator first, Size n, OutputIterator result);

复制元素

将从第一个开始的范围中的前n个元素复制到从结果开始的范围。

该函数将迭代器返回到目标范围的末尾(指向复制的最后一个元素之后的一个)。

如果n为负数,则该函数不执行任何操作。

如果范围重叠,则结果指向的范围中的某些元素可能具有未定义但有效的值。

此函数模板的行为等效于:

template
  OutputIterator copy_n (InputIterator first, Size n, OutputIterator result)
{
  while (n>0) {
    *result = *first;
    ++result; ++first;
    --n;
  }
  return result;
}

参数

  1. first
    以至少n个要复制的元素的顺序将迭代器输入到初始位置。
    InputIterator应指向可分配给OutputIterator指向的元素的类型。
  2. n
    要复制的元素数。
    如果此值为负,则该函数不执行任何操作。
    尺寸应为(可转换为)整体类型。
  3. result
    将迭代器输出到至少n个元素的目标序列中的初始位置。
    这不应指向[first,last]范围内的任何元素。

返回值

到目标范围末尾的迭代器,其中元素已被复制。

// copy_n algorithm example
#include      // std::cout
#include     // std::copy
#include        // std::vector

int main () {
  int myints[]={10,20,30,40,50,60,70};
  std::vector myvector;

  myvector.resize(7);   // allocate space for 7 elements

  std::copy_n ( myints, 7, myvector.begin() );

  std::cout << "myvector contains:";
  for (std::vector::iterator it = myvector.begin(); it!=myvector.end(); ++it)
    std::cout << ' ' << *it;

  std::cout << '\n';

  return 0;
}

在这里插入图片描述

例外

如果元素赋值或迭代器上的操作抛出,则抛出。请注意,无效参数会导致未定义的行为。

三、copy_if

头文件algorithm

template 
  OutputIterator copy_if (InputIterator first, InputIterator last,
                          OutputIterator result, UnaryPredicate pred);

复制范围的某些元素

将pred返回true的范围[first,last]中的元素复制到以result开头的范围。

此函数模板的行为等效于:

template 
  OutputIterator copy_if (InputIterator first, InputIterator last,
                          OutputIterator result, UnaryPredicate pred)
{
  while (first!=last) {
    if (pred(*first)) {
      *result = *first;
      ++result;
    }
    ++first;
  }
  return result;
}

参数

  1. first,last
    将迭代器输入到序列中的初始位置和最终位置。 复制的范围是[first,last),它包含first和last之间的所有元素,包括first指向的元素,但不包括last指向的元素。
    InputIterator应指向可分配给OutputIterator指向的元素的类型。
  2. result
    将迭代器输出到存储结果序列的范围的初始位置。 范围包括与[first,last]一样多的元素。
  3. pred
    一元函数接受范围内的元素作为参数,并返回可转换为bool的值。 返回的值指示是否要复制元素(如果为true,则复制它)。

该函数不得修改其任何参数。这可以是函数指针或函数对象。

范围不得重叠。

返回值

一个迭代器,指向结果序列中写入的最后一个元素后面的元素。

// copy_if example
#include      // std::cout
#include     // std::copy_if, std::distance
#include        // std::vector

int main () {
  std::vector foo = {25,15,5,-5,-15};
  std::vector bar (foo.size());

  // copy only positive numbers:
  auto it = std::copy_if (foo.begin(), foo.end(), bar.begin(), [](int i){return !(i<0);} );
  bar.resize(std::distance(bar.begin(),it));  // shrink container to new size

  std::cout << "bar contains:";
  for (int& x: bar) std::cout << ' ' << x;
  std::cout << '\n';

  return 0;
}

在这里插入图片描述

例外

如果任何pred,元素赋值或迭代器上的操作抛出,则抛出。请注意,无效参数会导致未定义的行为。

四、copy_backward

头文件algorithm

template 
  BidirectionalIterator2 copy_backward (BidirectionalIterator1 first,
                                        BidirectionalIterator1 last,
                                        BidirectionalIterator2 result);

向后复制元素范围

复制从最后开始到结束范围内的[first,last]范围内的元素。

该函数将迭代器返回到目标范围中的第一个元素。

结果范围的元素与[first,last]的顺序完全相同。 要撤消其顺序,请参阅reverse_copy。

该函数首先将*(last-1)复制到*(result-1)中,然后通过前面的元素向后移动,直到第一次到达(并包括它)。

范围不应以这样的方式重叠:结果(目标范围中的过去元素)指向范围内的元素(first,last)。对于这种情况,请参见copy。

此函数模板的行为等效于:

template
  BidirectionalIterator2 copy_backward ( BidirectionalIterator1 first,
                                         BidirectionalIterator1 last,
                                         BidirectionalIterator2 result )
{
  while (last!=first) *(--result) = *(--last);
  return result;
}

参数

  1. first,last
    双向迭代器到要复制的序列中的初始和最终位置。 使用的范围是[first,last),它包含first和last之间的所有元素,包括first指向的元素,但不包括last指向的元素。
  2. result
    双向迭代器到目标序列中的过去位置。
    这不应指向范围内的任何元素(第一个,最后一个)。

返回值

到目标序列的第一个元素的迭代器,其中元素已被复制。

// copy_backward example
#include      // std::cout
#include     // std::copy_backward
#include        // std::vector

int main () {
  std::vector myvector;

  // set some values:
  for (int i=1; i<=5; i++)
    myvector.push_back(i*10);          // myvector: 10 20 30 40 50

  myvector.resize(myvector.size()+3);  // allocate space for 3 more elements

  std::copy_backward ( myvector.begin(), myvector.begin()+5, myvector.end() );

  std::cout << "myvector contains:";
  for (std::vector::iterator it=myvector.begin(); it!=myvector.end(); ++it)
    std::cout << ' ' << *it;
  std::cout << '\n';

  return 0;
}

在这里插入图片描述

例外

如果元素赋值或迭代器上的操作抛出,则抛出。请注意,无效参数会导致未定义的行为。

你可能感兴趣的:(C++)