C++高阶

您所在的位置:网站首页 copy和roger C++高阶

C++高阶

2023-08-29 03:15| 来源: 网络整理| 查看: 265

copy()算法

copy()算法可以接受三个参数,前两个参数表示需要复制的源容器的起始位置和终止位置,它们共同定义了需要复制的数据元素的范围。第三个参数则是目标容器的起始位置。

copy()算法将前两个参数所表示的源容器范围内的数据,复制到第三个参数表示的目标容器的开始位置并依次往后。复制完成后, copy()算法会返回指向目标容器中被复制元素的结束位置,也就是最后一个元素的下一个位置。

要保证在目标容器的复制开始位置之后有足够的空间来容纳即将被复制进来的数据。必要的时候,可以根据被复制数据的多少,使用 vector 容器的 resize()函数调整目标容器的大小。

当复制行为发生在同一个容器中时,复制数据的源范围最好不要和目标范围相互重叠,否则很可能造成数据的混乱。

// 保存 C1 和 C2 班级成绩的容器 vector vecScoreC1; vector vecScoreC2; // 对容器进行操作,将各个班级的成绩保存到各自的容器中 // … // 保存所有成绩的成绩总表容器 vector vecScore; // 根据各个分容器的大小,重新设定总容器的容量, // 使它可以容纳即将复制进来的所有数据 vecScore.resize( vecScoreC1.size() + vecScoreC2.size() ) ; // 将第一个容器 vecScoreC1 中的数据复制到 vecScore 中 auto lastit = copy(vecScoreC1.begin(), vecScoreC1.end(), // 复制的范围 vecScore.begin() ); // 复制的目标位置 // 将第二个容器 vecScoreC2 中的数据追加到 vecScore 的末尾 copy(vecScoreC2.begin(), vecScoreC2.end(), lastit ); // 以上一次复制的结束位置作为第二次复制的开始位置 copy_backward()算法

使用 copy()算法复制数据,我们需要指定被复制数据在目标容器中的开始位置,然而有的时候,这个开始位置很难确定,而相应的结束位置却很好确定,或者是我们对结束位置有特殊的要求,在这种情况下,我们就可以使用 copy()算法的一个变种——copy_backward()算法。

它跟 copy()算法的使用非常相似,两者唯一的不同就是第三个参数和返回值的意义。首先是算法的第三个参数,在 copy()算法中,它是被复制数据在目标容器中的开始位置,而在 copy_backward()算法中,它成了结束位置。也就是说, copy_backward()算法会保证被复制的数据在这里结束。其次是返回值, copy()算法返回的是指向被复制元素在目标容器中的结束位置的迭代器,而 copy_backward()算法返回的迭代器指向的却是这些元素的开始位置。

// 保存学生对象的容器 vector vecStudent; // 将数据保存到容器中… // 扩大容器的容量为原来的两倍 // 这样容器中前半部分是已有的数据,后半部分是默认生成的数据 vecStudent.resize( vecStudent.size() * 2 ); // 将前半部分已有的数据复制到后半部分,替换掉后半部分默认的数据 copy_backward(vecStudent.begin(), vecStudent.begin() + vecStudent.size() / 2, // 前半部分范围 vecStudent.end() ); // 指定结束位置,复制数据填满容器 copy_if()算法

copy_if()算法需要指定源容器中被复制数据的范围以及目标容器中的起点位置,还可以接受一个函数作为第四个参数,用以表达我们对数据的筛选规则。这个函数的返回值为 bool 类型,拥有一个跟被复制数据类型相同的参数。

在进行复制的时候, copy_if()算法会逐个将复制范围内的数据传递给这个函数进行判断,只有符合筛选规则,也就是规则函数返回值为 true 的数据才会被复制。这样,我们就可以将源容器中的符合筛选条件的数据复制到目标容器中,实现数据的筛选。

// 引入需要的头文件 #include #include // 为了使用 copy_if()算法 #include using namespace std; // 复制规则函数 bool isgood(int n) { // 优秀的成绩(大于等于 85)才会返回 true,才会被复制 return n >= 85 ? true : false; } int main() { // 保存所有成绩的源容器 vector vecAll = {64,89,91,68,99,75}; // 用于保存筛选出来的优秀学生成绩的目标容器 vector vecGood; // 为目标容器预留足够的空间 vecGood.resize(vecAll.size()); // 使用 copy_if()算法将源容器中的优秀成绩复制到目标容器中 copy_if(vecAll.begin(),vecAll.end(), // 复制的范围 vecEnroll.begin(), // 目标容器的起始位置 isgood); // 复制规则 // 输出筛选出来的优秀成绩 cout"Pen","Erase","Pencil"}; // 办公用品类商品清单 vector vecOfficeSupplies = {"Folder","Pen","Notepad"}; // 根据源容器的数据多少调整目标容器的大小 vecGoods.resize( vecStationaries.size() + vecOfficeSupplies.size() ); // 使用 sort()算法对源容器进行排序 sort(vecStationaries.begin(), vecStationaries.end()); sort(vecOfficeSupplies.begin(), vecOfficeSupplies.end()); // 使用 set_union()算法将源容器中的数据合并到目标容器中 // set_union()算法返回的迭代器指向的是合并后的有效数据的结束位置 auto itend = set_union( vecStationaries.begin(), vecStationaries.end(),// 第一个容器的范围 vecOfficeSupplies.begin(), vecOfficeSupplies.end(), // 第二个容器的范围 vecGoods.begin()); // 目标容器的起始位置 // 输出合并后的商品 for(auto it = vecGoods.begin(); it != itend; // 以 set_union()算法返回的迭代器作为结束位置 ++it) { cout return 'A'; } else if(nScore >= 60)// 成绩高于等于 60 的是 B 等 { return 'B'; } else // 成绩低于 60 的就是 C 等 { return 'C'; } } //… // 保存原始的考试成绩的源容器 vector vecScore = {89,72,94,63,58}; // 保存学生等级的目标容器 vector vecGrade; // 根据源容器的数据多少调整目标容器的容量 vecGrade.resize(vecScore.size()); // 使用 transform()算法将源容器中的学生成绩转换为学生等级并保存到目标容器 // RateScore()函数负责具体的转换 transform(vecScore.begin(), vecScore.end(), // 参与转换的源容器范围 vecGrade.begin(), // 目标容器的起始位置 RateScore); // 转换函数 // 输出转换后的学生等级 for(char cGrade : vecGrade) { cout98,85,96,75,68}; vector vecScoreEng = {68,82,93,62,88}; // 定义保存综合成绩的容器 vector vecScore; // 改变容器的容量,让它有足够的空间保存结果 vecScore.resize( vecScoreMath.size() ); // 将 vecScoreMath 和 vecScoreEng 容器中的成绩相加, // 将结果保存到结果容器 vecScore 中 transform(vecScoreMath.begin(), vecScoreMath.end(), // 输入数据的范围 vecScoreEng.begin(), // 第二个输入数据的起始位置 vecScore.begin(), //目标容器的起始位置 add ); // 对数据进行处理的操作函数


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3