C++标准库学习之 STL 多重区间处理
作者:访客发布时间:2023-12-24分类:程序开发学习浏览:82
导读:在日常开发C++的过程中肯定会遇到将数据从一个容器赋值到另一个容器,我们来看一个例子,来引出我们的问题#include<iostream>#include<...
在日常开发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内没有内容,这在遍历过程中就会访问到野指针,所以
如果某个算法用来处理多重区间,当你调用它时,务必要保证第二(或者多个)容器区间所拥有的元素个数至少和第一个区间的大小是相等的才可以
那么上面的例子该如何修改呢,
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
使用 适配器迭代器后的例子就变成了如下的方式
#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 可以解决的问题是目标空间不足的情况,会使目标空间按照指定大小成长
- 程序开发学习排行
-
- 1鸿蒙HarmonyOS:Web组件网页白屏检测
- 2HTTPS协议是安全传输,为啥还要再加密?
- 3HarmonyOS鸿蒙应用开发——数据持久化Preferences
- 4记解决MaterialButton背景颜色与设置值不同
- 5鸿蒙HarmonyOS实战-ArkUI组件(RelativeContainer)
- 6鸿蒙HarmonyOS实战-ArkUI组件(Stack)
- 7[Android][NDK][Cmake]一文搞懂Android项目中的Cmake
- 8Android广播如何解决Sending non-protected broadcast问题
- 9鸿蒙HarmonyOS实战-ArkUI组件(mediaquery)
- 最近发表
-
- WooCommerce最好的WordPress常用插件下载博客插件模块的相关产品
- 羊驼机器人最好的WordPress常用插件下载博客插件模块
- IP信息记录器最好的WordPress常用插件下载博客插件模块
- Linkly for WooCommerce最好的WordPress常用插件下载博客插件模块
- 元素聚合器Forms最好的WordPress常用插件下载博客插件模块
- Promaker Chat 最好的WordPress通用插件下载 博客插件模块
- 自动更新发布日期最好的WordPress常用插件下载博客插件模块
- WordPress官方最好的获取回复WordPress常用插件下载博客插件模块
- Img to rss最好的wordpress常用插件下载博客插件模块
- WPMozo为Elementor最好的WordPress常用插件下载博客插件模块添加精简版