我不太懂的STL(学到老活到老)

STL 的一些用法

在工程实践中,总是能看到新的未曾了解过的STL函数或用法。每次都得重新查阅,比较麻烦。将一些不懂的内容记录下来,以备时时翻阅

std::copy_if 

参考链接:https://www.cnblogs.com/pandamohist/p/13854881.html

copy_if() 算法可以从源序列复制使谓词返回 true 的元素,所以可以把它看作一个过滤器。

前两个参数定义源序列的输入迭代器,第三个参数是指向目的序列的第一个位置的输出迭代器,第 4 个参数是一个谓词。该函数会返回一个输出迭代器,它指向最后一个被复制元素的下一个位置。

源码:

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

实例:

// 1. 构建一个原始数组
std::vector<int> src_vector(5);
// iota(起始,结束,从哪一个开始);
std::iota(src_vector.begin(), src_vector.end(), 10);

// 2. 将原始数组拷贝到目标数组
std::vector<int> dst_vector(src_vector.size());

// 3. 将 src 拷贝到 dst,当时只拷贝大于13的元素。
auto it = std::copy_if(src_vector.begin(), src_vector.end(), dst_vector.begin(), [](const int item) {return item > 13; });

 

std::transform

参考链接:https://blog.csdn.net/fengbingchun/article/details/63252470

transform() 可以将函数应用到制定的范围内,并将这个函数返回的值保存到另一个序列中,它返回的迭代器指向输出序列所保存的最后一个元素的下一个位置。

主要作用是可以节省for循环写法,简化代码,更加直观

源码:

以下是std::transform的两个声明,一个是对应于一元操作,一个是对应于二元操作。

template <class InputIterator, class OutputIterator, class UnaryOperation>
  OutputIterator transform (InputIterator first1, InputIterator last1,
                            OutputIterator result, UnaryOperation op);
	
template <class InputIterator1, class InputIterator2,
          class OutputIterator, class BinaryOperation>
  OutputIterator transform (InputIterator1 first1, InputIterator1 last1,
                            InputIterator2 first2, OutputIterator result,
                            BinaryOperation binary_op);

对于一元操作,将op应用于[first1, last1)范围内的每个元素,并将每个操作返回的值存储在以result开头的范围内。给定的op将被连续调用last1-first1次。op可以是函数指针或函数对象或lambda表达式。

对于二元操作,使用[first1, last1)范围内的每个元素作为第一个参数调用binary_op,并以first2开头的范围内的每个元素作为第二个参数调用binary_op,每次调用返回的值都存储在以result开头的范围内。给定的binary_op将被连续调用last1-first1次。binary_op可以是函数指针或函数对象或lambda表达式。

实例:

//一元: 将[first1, last1)范围内的每个元素加5,然后依次存储到result中
int op_increase(int i) {return (i + 5)};
std::transform(first1, last1, result, op_increase);

//二元:将first1和first2开头的范围内的每个元素相加,然后依次存储到result中。
int op_add(int, a, int b) {return (a + b)};
std::transform(first1, last1, first2, result, op_add);

 

posted @ 2022-06-07 11:22  Clovran-Wong  阅读(55)  评论(0编辑  收藏  举报