C++标准库学习之 STL 多重区间处理

在日常开发C++的过程中肯定会遇到将数据从一个容器赋值到另一个容器,我们来看一个例子,来引出我们的问题

c 复制代码
#include <iostream>
#include <vector>
#include <algorithm>

int main(){

    std::cout<< "----------------start-------------------"<<std::endl;

    // 创建一个向量,带有初始内容
    std::vector<int> tsm_vector ={5,1,5,2,3,7,3,5,3,2,4,5,2,1,2,4};

    //创建一个向量,未指定内容
    std::vector<int> tsm_vector_2;

    // 从 向量1的开始到向量1的结尾,将数据copy 的向量2中
    std::copy(tsm_vector.cbegin(),tsm_vector.cend(),tsm_vector_2.begin());

    //遍历向量2
    for (auto item: tsm_vector_2){
        std::cout<< item<<std::endl;
    }
    
    std::cout<< "----------------end-------------------"<<std::endl;

    return 0;
}

上面这个例子比较简单,就是创建了一个有初始值的容器,又创建了一个空的容器,将容器 1 的数据copy 到容器2内,一般情况下如果 容器2的空间大于等于 容器1 的空间这样遍历是没有问题,但是这个例子中容器2内没有内容,这在遍历过程中就会访问到野指针,所以

如果某个算法用来处理多重区间,当你调用它时,务必要保证第二(或者多个)容器区间所拥有的元素个数至少和第一个区间的大小是相等的才可以

那么上面的例子该如何修改呢,

c 复制代码
int main(){

    std::cout<< "----------------start-------------------"<<std::endl;

    // 创建一个向量,带有初始内容
    std::vector<int> tsm_vector ={5,1,5,2,3,7,3,5,3,2,4,5,2,1,2,4};

    //创建一个向量,未指定内容
    std::vector<int> tsm_vector_2;
    
    //修稿容器2 的区间
    tsm_vector_2.resize(tsm_vector.size());

    // 从 向量1的开始到向量1的结尾,将数据copy 的向量2中
    std::copy(tsm_vector.cbegin(),tsm_vector.cend(),tsm_vector_2.begin());

    //遍历向量2
    for (auto item: tsm_vector_2){
        std::cout<< item<<std::endl;
    }

    std::cout<< "----------------end-------------------"<<std::endl;

    return 0;
}

那就是在copy之前,先修改他的区间,让他拥有和容器1相同的元素个数,

但是上面这种处理方式比较死板,而且存在很多问题,我们能不能一边读一边扩容呢,

迭代器适配器 Insert Interator

使用 适配器迭代器后的例子就变成了如下的方式

c 复制代码
#include <iostream>
#include <vector>
#include <algorithm>

int main(){

    std::cout<< "----------------start-------------------"<<std::endl;

    // 创建一个向量,带有初始内容
    std::vector<int> tsm_vector ={5,1,5,2,3,7,3,5,3,2,4,5,2,1,2,4};

    //创建一个向量,未指定内容
    std::vector<int> tsm_vector_2;

//    //修稿容器2 的区间
//    tsm_vector_2.resize(tsm_vector.size());
//
//    // 从 向量1的开始到向量1的结尾,将数据copy 的向量2中
//    std::copy(tsm_vector.cbegin(),tsm_vector.cend(),tsm_vector_2.begin());

    //使用 inserter 迭代器适配器来处理,一边插入,一边扩容
    std::copy(tsm_vector.cbegin(),tsm_vector.cend(),std::inserter(tsm_vector_2,tsm_vector_2.begin()));


    //遍历向量2
    for (auto item: tsm_vector_2){
        std::cout<< item<<std::endl;
    }

    std::cout<< "----------------end-------------------"<<std::endl;

    return 0;
}

注意: inserter 插入型适配地迭代器的操作是插入,而并非是覆写,那么 inserter 可以解决的问题是目标空间不足的情况,会使目标空间按照指定大小成长

相关推荐
君义_noip4 分钟前
CSP-S 2025 入门级 第一轮(初赛) 完善程序(1)
c++·算法·信息学奥赛·初赛·csp 第一轮
蜡笔小马1 小时前
07.C++设计模式-组合模式
c++·设计模式·组合模式
liulilittle2 小时前
TCP UCP v1.0:BBR 的非破坏性约束层
网络·c++·网络协议·tcp/ip·算法·c·通信
每天回答3个问题2 小时前
leetcodeHot100 | 104.二叉树的最大深度
c++·面试·
坚果派·白晓明2 小时前
【鸿蒙PC三方库移植适配框架解读系列】第五篇:完整流程图与角色职责
c语言·c++·华为·harmonyos·鸿蒙
xiao_li_ya3 小时前
C++学习日记1(`*`的理解、const关键词)
开发语言·c++
郝学胜-神的一滴4 小时前
Qt 入门 01-02: 开发环境搭建指南
开发语言·c++·qt·客户端
Languorous.4 小时前
C++数据结构高阶|布隆过滤器(Bloom Filter)深度解析:从原理到手写实现,面试高频考点全覆盖
数据结构·c++·面试
山河木马5 小时前
Emscripten 从 C/C++ 调用 JavaScript
前端·javascript·c++
TANGLONG2225 小时前
【C++】继承详解——基类/派生类、作用域、默认函数、菱形继承(超详细)
java·c语言·c++·经验分享·笔记·ajax