首页 > 编程语言 >C++基础夯实

C++基础夯实

时间:2024-04-01 18:48:18浏览次数:19  
标签:std inserter destination 基础 back C++ 夯实 memcpy 向量

 

std::copy
std::search
std::back_inserter
std::equal
memcpy

演示如何使用

std::copy

std::search

std::back_inserter 

std::equal 这四个方法。

我们假设有两个向量,一个源向量 source,一个目标向量 destination。我们将首先使用 std::copy 方法将源向量中的元素复制到目标向量中,然后使用 std::search 方法在目标向量中搜索一个子序列,最后使用 std::back_insert 方法向目标向量中插入一些元素,再使用 std::equal 方法比较两个向量是否相等。

下面是完整的示例代码:

#include <iostream>
#include <vector>
#include <algorithm>

int main() {
    // 定义源向量
    std::vector<int> source = {1, 2, 3, 4, 5};
    // 定义目标向量
    std::vector<int> destination;

    // 使用 std::copy 方法将源向量中的元素复制到目标向量中
    std::copy(source.begin(), source.end(), std::back_inserter(destination));

    // 使用 std::search 方法在目标向量中搜索子序列 {3, 4, 5}
    std::vector<int> subsequence = {3, 4, 5};
    auto it = std::search(destination.begin(), destination.end(), subsequence.begin(), subsequence.end());

    if (it != destination.end()) {
        std::cout << "Subsequence found at index: " << std::distance(destination.begin(), it) << std::endl;
    } else {
        std::cout << "Subsequence not found" << std::endl;
    }

    // 使用 std::back_insert 方法向目标向量中插入一些元素
    std::back_insert_iterator<std::vector<int>> backInserter(destination);
    *backInserter = 6;
    *backInserter = 7;

    // 使用 std::equal 方法比较两个向量是否相等
    if (std::equal(source.begin(), source.end(), destination.begin())) {
        std::cout << "Source and destination vectors are equal" << std::endl;
    } else {
        std::cout << "Source and destination vectors are not equal" << std::endl;
    }

    return 0;
}

 

std::back_inserter 是 C++ 标准库中的一个函数模板,用于创建一个 std::back_insert_iterator 对象,从而方便地向容器的末尾插入元素。它通常用于简化代码,使得在使用算法时能够直接将元素插入到容器的末尾,而无需手动创建 std::back_insert_iterator 对象。

下面是一个示例,演示了如何使用 std::back_inserterstd::vector 中插入元素:

#include <iostream>
#include <vector>
#include <iterator> // 包含 back_inserter

int main() {
    // 定义一个目标向量
    std::vector<int> vec;

    // 使用 std::back_inserter 创建 back_insert_iterator
    auto backInserter = std::back_inserter(vec);

    // 使用 * 操作符向 back_insert_iterator 插入元素
    *backInserter = 1;
    *backInserter = 2;
    *backInserter = 3;

    // 使用算法 std::copy 将另一个向量的元素插入到目标向量的末尾
    std::vector<int> anotherVec = {4, 5, 6};
    std::copy(anotherVec.begin(), anotherVec.end(), backInserter);

    // 输出目标向量的元素
    std::cout << "Target vector elements:";
    for (const auto& elem : vec) {
        std::cout << " " << elem;
    }
    std::cout << std::endl;

    return 0;
}

在这个示例中,我们使用 std::back_inserter 创建了一个插入器 backInserter,并将其用于向 std::vector 容器 vec 中插入元素。接着,我们使用 * 操作符将元素插入到 backInserter,它会自动将元素插入到 vec 的末尾。然后,我们使用 std::copy 算法将另一个向量 anotherVec 的元素插入到目标向量 vec 的末尾。最后,我们遍历目标向量,并输出其元素。

这样,使用 std::back_inserter 能够简化向容器插入元素的过程,特别是在使用算法时非常方便。

 


 

memcpy 是 C 语言和 C++ 语言中的一个标准库函数,用于在内存块之间进行字节级别的复制。它通常用于将数据从一个内存地址复制到另一个内存地址,其原型定义在 <cstring> 头文件中:

void* memcpy(void* destination, const void* source, size_t num);

其中,destination 是目标内存地址的指针,source 是源内存地址的指针,num 表示要复制的字节数。

以下是 memcpy 函数的一些关键特点和使用方法:

  1. 字节级别复制: memcpy 以字节为单位进行复制,它不关心内存块中存储的具体类型,只是简单地从源地址复制字节到目标地址。因此,它是一种非常底层的复制操作。

  2. 内存重叠问题: 如果源内存区域和目标内存区域有重叠部分,memcpy 的行为是未定义的,可能会导致意想不到的结果。为避免这种情况,可以使用 memmove 函数,它可以处理内存重叠的情况。

  3. 效率: memcpy 函数通常由平台提供高效的实现,因此在性能上表现很好。它可能会利用 CPU 的特定指令集或者其他优化来实现高效的复制操作。

  4. 没有空指针检查: memcpy 函数不会检查指针是否为空,因此在使用时需要确保传入的指针是有效的,否则可能会导致程序崩溃或者未定义行为。

以下是一个简单的示例,演示了如何使用 memcpy 函数进行内存复制:

#include <iostream>
#include <cstring> // 包含 memcpy 函数的头文件

int main() {
    const char* source = "Hello, world!"; // 源字符串
    char destination[20]; // 目标内存区域,足够大以容纳源字符串

    // 使用 memcpy 将源字符串复制到目标内存区域
    std::memcpy(destination, source, std::strlen(source) + 1);

    // 输出目标字符串
    std::cout << "Copied string: " << destination << std::endl;

    return 0;
}

在这个示例中,我们将源字符串 "Hello, world!" 复制到了目标内存区域 destination 中,然后输出了目标字符串。需要注意的是,我们在调用 memcpy 函数时,通过 std::strlen(source) + 1 计算了源字符串的长度,并将其作为要复制的字节数传递给了 memcpy 函数。

 

std::copy(queuebuffer.begin(), queuebuffer.end(), std::back_inserter(window)); 这行代码的作用是将 queuebuffer 容器中的所有元素复制到 window 容器的末尾。

下面是一个示例代码,演示了如何使用这行代码:

#include <iostream>
#include <algorithm>
#include <vector>
#include <iterator>

int main() {
    std::vector<int> queuebuffer = {1, 2, 3, 4, 5}; // 源容器
    std::vector<int> window; // 目标容器

    // 使用 std::copy 和 std::back_inserter 将 queuebuffer 中的元素复制到 window 的末尾
    std::copy(queuebuffer.begin(), queuebuffer.end(), std::back_inserter(window));

    // 输出目标容器 window 中的元素
    std::cout << "Copied elements:";
    for (const auto& elem : window) {
        std::cout << " " << elem;
    }
//Copied elements: 1 2 3 4 5 std::cout << std::endl; return 0; }

在这个示例中,我们创建了一个 queuebuffer 容器,并初始化了一些元素。然后,使用 std::copy 算法和 std::back_inserter 辅助函数将 queuebuffer 中的元素复制到 window 容器的末尾,最后输出了 window 容器中的元素。

 

 

标签:std,inserter,destination,基础,back,C++,夯实,memcpy,向量
From: https://www.cnblogs.com/music-liang/p/18109129

相关文章

  • 初探c++:string类的进阶运用
    1.begin()和end(),前一个指向字符串的第一个字符,第二个指向字符串的\0 strings=("helloworld"); string::iteratorit=s.begin(); while(it!=s.end()) { cout<<*it<<""; ++it; } cout<<endl;这是正向迭代器的经典应用如果要实现反向迭代器,就......
  • C++基础——选择结构与循环结构
    基础:选择语句☑️❌if语句if(a){//a判断表达式,如果a为真那就执行语句}if语句还可以与else结合使用if(a){//a判断表达式,如果a为真那就执行语句}elseif(b){//如果a为假,b为真那就执行语句}else{如果a和b都为假,那就执行该语句}swi......
  • 网络安全入门教程(非常详细)从零基础入门到精通!
    网络安全是一个庞大而不断发展的领域,它包含多个专业领域,如网络防御、网络攻击、数据加密等。介绍网络安全的基本概念、技术和工具,逐步深入,帮助您成为一名合格的网络安全从业人员。一、网络安全基础知识1.计算机基础知识了解了计算机的硬件、软件、操作系统和网络结构等基础......
  • 刷好题,固基础-6
    L3-002特殊堆栈堆栈是一种经典的后进先出的线性结构,相关的操作主要有“入栈”(在堆栈顶插入一个元素)和“出栈”(将栈顶元素返回并从堆栈中删除)。本题要求你实现另一个附加的操作:“取中值”——即返回所有堆栈中元素键值的中值。给定N个元素,如果N是偶数,则中值定义为第N/2......
  • Windows编程系列:图形编程基础
    前言很早以前在github上看到的一个项目,通过hookWindowsAPI函数FillRect,对资源管理器背景进行了重绘。项目地址如下:https://github.com/Maplespe/explorerTool 我第一次见到的时候,觉得这个项目还是非常吸引我,因为从XP过后,我再也没有实现过为资源管理器添加背景图片。在XP......
  • 从基础入门到学穿C++(类和对象篇)【超详细】【一站式速通】
    类和对象C语言是一种面向过程的语言,C++和python、java一样都是一种面向对象的语言。面向对象编程(Object-OrientedProgramming,OOP)和面向过程编程(ProceduralProgramming)是两种不同的编程范式面向对象编程:强调的是将现实世界中的事物抽象成对象,并通过对象之间的交互来实现......
  • 算法基础
    1.算法的特性输入输出算法具有零个或者多个输入,同时,算法具有至少一个的输出。对于在屏幕上打印”HelloWorld”一样,你可以不需要有任何的输入,直接输出得到结果即可,而对于一个没有输出的算法,没有任何意义。确定性算法的每一步都具有确定的含义,无二义性。任何条件下,算法只......
  • 1.网络基础基础了解
    一、环境准备,软件包ensp(先装下面三个)virtualboxwinpcapwireshark二、数据通信的原理从个方面说:(1)IP地址:(2)路由技术:(3)DNS域名系统1、IP地址1)、IP的基本认识IP在TCP/IP参考模型中处于第三层1️⃣:应用层,是一些协议(如:ftp文件传输,ssh远程登录,http网络请求)2️⃣:传......
  • 利用IT++搭建通信仿真平台(C++)
     IT++isaC++libraryofmathematical,signalprocessingandcommunicationclassesandfunctions。也就是说有了这个库,用C++编写通信仿真程序的方便程度接近于matlab。具体介绍和文件下载可以上官方网站。“由于Matlab效率太低(除了可以验证算法外),所以需要更快......
  • 测试基础和功能测试
    一、质量模型1.功能性:功能数量、功能正确实现、错误处理情况2.性能3.兼容性:浏览器兼容性:谷歌,火狐,Edge4.易用性:简洁、友好、流畅、美观5.可靠性6.安全性7.可移植性8.可维护性*.界面布局a.布局与UI原型一致b.图片与文字准确与UI原型无误二、测试流程1.需求......