在 C++ STL 中复制的不同方法

2023-11-05

传送门 ==>> AutoSAR实战系列300讲「糖果Autosar」总目录

1 C++ STL 中复制的不同方法及实例解析

C++ STL 中存在各种不同的 copy(),它们允许以不同的方式执行复制操作,它们都有自己的用途。这些都在标题 中定义。本文向大家介绍这些函数,供日常编程使用。

  1. copy(strt_iter1, end_iter1, strt_iter2) :用于将一系列元素从一个容器复制到另一个容器的通用复制函数。它需要 3 个参数:
    strt_iter1 :指向源容器开头的指针,必须从那里开始复制元素。
    end_iter1 :指向源容器末尾的指针,直到必须复制元素为止。
    strt_iter2 :指向目标容器开头的指针,指向必须开始复制元素的位置。

  2. copy_n(strt_iter1, num, strt_iter2) :此版本的副本允许自由选择必须在目标容器中复制多少元素。IT 还需要 3 个参数:
    strt_iter1 :指向源容器开头的指针,必须从那里开始复制元素。
    num :整数,指定从 strt_iter1 开始将多少个数字复制到目标容器。如果输入负数,则不执行任何操作。
    strt_iter2 :指向目标容器开头的指针,指向必须开始复制元素的位置。

// C++ code to demonstrate the working of copy()
// and copy_n()
 
#include<iostream>
#include<algorithm> // for copy() and copy_n()
#include<vector>
using namespace std;
 
int main()
{
     
   // initializing source vector
   vector<int> v1 = { 1, 5, 7, 3, 8, 3 };
    
   // declaring destination vectors
   vector<int> v2(6);
   vector<int> v3(6);
    
   // using copy() to copy 1st 3 elements
   copy(v1.begin(), v1.begin()+3, v2.begin());
    
   // printing new vector
   cout << "The new vector elements entered using copy() : ";
   for(int i=0; i<v2.size(); i++)
   cout << v2[i] << " ";
    
   cout << endl;
    
   // using copy_n() to copy 1st 4 elements
   copy_n(v1.begin(), 4, v3.begin());
    
   // printing new vector
   cout << "The new vector elements entered using copy_n() : ";
   for(int i=0; i<v3.size(); i++)
   cout << v3[i] << " ";
   
}
输出: 

The new vector elements entered using copy() : 1 5 7 0 0 0 
The new vector elements entered using copy_n() : 1 5 7 3 0 0
  1. copy_if():顾名思义,这个函数根据“条件”的结果进行复制。这是在第四个参数的帮助下提供的,一个返回布尔值的函数。
    这个函数有 4 个参数,其中 3 个类似于 copy() 和一个附加函数,当返回 true 时,复制一个数字,否则不复制数字。
  2. copy_backward():该函数从向后开始将元素复制到目标容器中,并继续复制,直到所有数字都没有复制。复制从“ strt_iter2 ”开始,但方向相反。它也采用与 copy() 类似的参数。
// C++ code to demonstrate the working of copy_if()
// and copy_backward()
 
#include<iostream>
#include<algorithm> // for copy_if() and copy_backward()
#include<vector>
using namespace std;
 
int main()
{
     
    // initializing source vector
    vector<int> v1 = { 1, 5, 6, 3, 8, 3 };
         
    // declaring destination vectors
    vector<int> v2(6);
    vector<int> v3(6);
         
    // using copy_if() to copy odd elements
    copy_if(v1.begin(), v1.end(), v2.begin(), [](int i){return i%2!=0;});
         
    // printing new vector
    cout << "The new vector elements entered using copy_if() : ";
    for(int i=0; i<v2.size(); i++)
    cout << v2[i] << " ";
         
    cout << endl;
         
    // using copy_backward() to copy 1st 4 elements
    // ending at second last position
    copy_backward(v1.begin(), v1.begin() + 4, v3.begin()+ 5);
         
    // printing new vector
    cout << "The new vector elements entered using copy_backward() : ";
    for(int i=0; i<v3.size(); i++)
    cout << v3[i] << " ";
 
}
输出: 

The new vector elements entered using copy_if() : 1 5 3 3 0 0 
The new vector elements entered using copy_backward() : 0 1 5 6 3 0 
  1. 使用 inserter() 复制:
    在 copy() 操作之前让我们了解 inserter() 的语法。
    inserter() 用作我们要复制容器元素的目的地。
    inserter() 接受两个参数。第一个是任意类型的容器,第二个是容器的迭代器。
    它返回一个在任意类型容器上工作的 insert_iterator 实例。这个包装函数有助于创建 insert_iterator 实例。键入 %iterator 的名称需要知道容器的精确完整类型,这可能很乏味并妨碍泛型编程。使用此功能可以让您利用自动模板参数推导,使编译器为您匹配正确的类型。
inserter() 的语法:

std::inserter(Container& x, typename Container::iterator it);


x:将插入新元素的目标容器。it:指向插入点的迭代器。

返回: 一个 insert_iterator 将元素插入到x 所指示的位置。

使用 inserter() 进行复制的语法:

copy(strt_iter1, end_iter1, inserter(Container& x, typename Container::iterator it));
// C++ code to demonstrate the working of copy() using inserter()
 
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
 
int main()
{
 
    vector<int> v1 = {1, 5, 7, 3, 8, 3};
    vector<int>::iterator itr;
    vector<int> v2;
 
    //using inserter()
    copy(v1.begin(), v1.end(), inserter(v2, itr));
 
    cout << "\nThe new vector elements entered using inserter: ";
    for (int i = 0; i < v2.size(); i++)
        cout << v2[i] << " ";
 
}

输出:

The new vector elements entered using inserter: 1 5 7 3 8 3 
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 C++ STL 中复制的不同方法 的相关文章

随机推荐

  • linux下select()函数

    1 I O处理的模型有5种 1 gt 阻塞I O模型 在这种模型下 若所调用的I O函数没有完成相关的功能 则会使进程挂起 直到相关数据到达才会返回 如常见的对管道 终端 网络设备进行读写时经常会出现这种情况 2 gt 非阻塞I O模型 在
  • Python——基础学习xpath(爬虫)

    python三种解析方法 1 正则 2 bs4 3 xpath Python xpath解析 xpath解析是最常用且最便捷高效的一种解析方法 通用性最强 xpath解析原理 1 实例一个etree的对象 且需要将被解析的页面的源码数据加载
  • 转载,envi对高光谱进行辐射定标和大气校正

    原文地址 http blog sina com cn s blog 764b1e9d0102v59e html 目录 辐射定标和大气校正 概述 辐射定标 多光谱数据FLAASH大气校正 3 1 FLAASH输入数据要求 3 2 详细操作步骤
  • 去除list of list中的引号与括号

    经常分词后是List of list的结构 输出后会存在很多引号与方括号 它其实是一个list的嵌套结构 可以通过将内层的List转化为str再放入新的list中实现转化 a 我要发 SCI 然后 去 四川大学 读博士 result for
  • Laya 实操十七:物理引擎

    物理引擎 export default class test extends Laya Script constructor super Laya Scene3D load res LayaScene SampleScene Convent
  • Python清洗数据具体操作

    数据清洗是指在处理数据之前对数据进行预处理的过程 这个过程通常包括检查数据的完整性 清除数据中的缺失值 异常值和重复值 以及对数据进行格式转换和数据转换等 在 Python 中 可以使用 pandas 库来方便地进行数据清洗 下面是一些常见
  • Android 禁止RecycleView的滑动

    1 问题 使用RecycleView 时 如果数据量很少只有几个 需求不需要它上下左右滑动 在xml配置中加上Android scrollbars none 这只是去掉了滑动bar 但是RecycleView 上下还是能滑动 且有阴影 2
  • 【message:发生错误 Error: D:\微信小程序\second-demo\package.json 对应的 node_modules 不存在】

    微信小程序安装vant weapp报 node module不存在 提示 这里简述项目相关背景 想使用vant weapp写小程序 在安装的时候踩了一些坑 记录一下 1 安装 vant weapp 提示 这里一个一个来描述遇到的问题 我是根
  • 网络驱动程序snull

    由于下次开会要做报告 所以就先把字符设备驱动程序那块搁浅了 先来复习下网络驱动这块 虽然以前看过 学习过网络驱动的相关内容 但是当再次学习这块的时候 仍然有新的收获 或许是时间长不看了 有些东西的印象浅了 或者应了那句话 温故而知新 ok
  • 多线程能有事务吗?

    需求 多线程插入 保证原子性 要么都成功 要么都失败 其中一个线程报错 所有线程回滚 为什么做不了 首先事务的四大特性 ACID 特性都知道吧 面试中张口就来 原子性 Atomicity 一个事务要么全部提交成功 要么全部失败回滚 不能只执
  • SpringFramework核心技术五:面向切面编程(AOP)和代理机制

    AOP与代理 Spring AOP使用JDK动态代理或CGLIB为给定目标对象创建代理 只要有选择 JDK动态代理就是首选 一 代理机制 如果要代理的目标对象实现至少一个接口 则将使用JDK动态代理 目标类型实现的所有接口都将被代理 如果目
  • socket异步编程--libevent的使用

    http www cnblogs com cnspace archive 2011 07 19 2110891 html 这篇文章介绍下libevent在socket异步编程中的应用 在一些对性能要求较高的网络应用程序中 为了防止程序阻塞在
  • Spring Boot集成RocketMq(一看就会)

    目录 1 创建topic 2 新建Spring boot项目 3 导入依赖 4 配置yml文件 5 新建Controller 生产服务 6 新建消费者 7 配置类 定义topic 8 添加消息以及 消费者查看 8 1 调用接口 往Mq中添加
  • 岛屿数量(Java)

    分析 把1当成陆地 0当成海 简单来说只要上下左右如果是1的话就可以看成一个陆地 从示例中也可以很清楚的看懂 思路 用一个和grid大小一样的整型二维数组arr来代表岛屿的生成过程 遍历grid 如果遇到grid i j 1 arr i j
  • 软件生命周期与技术人的职业周期

    话题有点大 但还是忍住想说两句 也算把自己曾经的困惑落在纸上 做个记录 什么是软件的生命周期的 相信你能比我还熟练的罗列出来 从初步规划 到需求分析 再到系统设计 接着系统实现 往下系统测试 跟着发布部署 最后运行维护 中途免不了打些小补丁
  • UART通信原理

    UART 通信格式 串口全称叫做串行接口 通常也叫做 COM 接口 串行接口指的是数据一个一个的顺序传输 通信线路简单 使用两条线即可实现双向通信 一条用于发送 一条用于接收 串口通信距离远 但是速度相对会低 串口是一种很常用的工业接口 I
  • python国内镜像源

    让python pip使用国内镜像 国内源 清华 https pypi tuna tsinghua edu cn simple 阿里云 http mirrors aliyun com pypi simple 中国科技大学 https pyp
  • 有关HC-05蓝牙模块的学习记录

    文章目录 HC 05学习笔记 一 HC 05的基本硬件介绍 二 工作原理 三 使用方法 一 硬件连接 二 软件控制 1 第一个片段 2 第二个片段 四 具体应用 一 信息的传送 二 手机操纵单片机 五 注意事项 一 AT状态 1 第一种方法
  • mysql存储过程之循环(WHILE,REPEAT和LOOP)

    MySQL提供循环语句 允许我们根据条件重复执行一个SQL代码块其中有三个循环语句 WHILE REPEAT和LOOP 我们接下来分别看下 首先是WHILE语句来看下语法 WHILE expression DO statements END
  • 在 C++ STL 中复制的不同方法

    文章目录 1 C STL 中复制的不同方法及实例解析 传送门 gt gt AutoSAR实战系列300讲 糖果Autosar 总目录 1 C STL 中复制的不同方法及实例解析 C STL 中存在各种不同的 copy 它们允许以不同的方式执