STL算法篇之拷贝修改类算法

简介: STL算法篇之拷贝修改类算法

拷贝类算法

1.copy 区间拷贝

2.copy_backward 逆向拷贝

3.remove 删除

4.remove_copy 删除另存

5.remove_if 条件删除

6.remove_copy_if 条件删除结果另存

copy与copy_backward

这两个函数的前两个参数,表示被拷贝迭代器的范围,

第三个参数有所区别,

copy的第三个参数是迭代器的初始位置(正向拷贝),

copy_backward的第三个参数是迭代器的末位置(反向拷贝)

意:这里的反向拷贝指的是拷贝的位置反向,不是说将拷贝的数据反向

#include<iostream>
#include<functional>
#include<algorithm>
#include<vector>
#include<array>
using namespace std;
int main()
{
  array<int, 4> v1 = { 1, 2, 3,4 };
  vector<int> v2(v1.size()); //copy
  vector<int> v3(v1.size()); //copy_backward
  copy(v1.begin(), v1.end(), v2.begin());
  /*for (auto& v: v2)
  {
    cout << v;
  }*/
  for_each(v2.begin(), v2.end(), [](int& date) {cout << " " << date; });
  cout << endl;
  copy_backward(v1.begin(), v1.end(), v3.end());
  copy(v3.begin(), v3.end(), ostream_iterator<int>(cout, " ")); 
  //copy函数与流型迭代器的结合打印数据
  return 0;
}

容器数据的打印方法有很多

1.可以用auto关键字的范围for循环

2.可以用for_each()算法

3.可以用copy()函数与流型迭代器相结合

4.可以采用迭代器的方式去打印

remove与remove_copy

注意:这remove删除,并不是真正意义上的删除**(如果想真正意义上的删除,再用一个尾删就行**),他只是把删除的数据覆盖,但是容器元素的个数是没有改变的。

remove_copy 将删除的结果另存,倒是可以做到真正意义上的删除

#include<iostream>
#include<functional>
#include<algorithm>
#include<vector>
#include<array>
using namespace std;
int main()
{
  vector<int> v1 = { 1, 2, 3 ,4, 5, 6 };
  vector<int> v2(v1.size());
  vector<int> ::iterator it = remove(v1.begin(), v1.end(), 2);
  for_each(v1.begin(), v1.end(), [](int& date) {cout << date << " "; });
  return 0;
}

#include<iostream>
#include<functional>
#include<algorithm>
#include<vector>
#include<array>
using namespace std;
int main()
{
  vector<int> v1 = { 1, 2, 3 ,4, 5, 6 };
  vector<int> v2(v1.size() - 1);
  vector<int> ::iterator it = remove(v1.begin(), v1.end(), 2);
  for_each(v1.begin(), v1.end(), [](int& date) {cout << date << " "; });
  cout << endl;
  auto it1 = remove_copy(v1.begin(), v1.end(), v2.begin(), 3);
  for_each(v2.begin(), v2.end(), [](int& date) {cout << date << " "; });
  return 0;
}

remove_if与remove_copy_if

#include<iostream>
#include<functional>
#include<algorithm>
#include<vector>
#include<array>
using namespace std;
int main()
{
  vector<int> v1 = { 1, 2, 3 ,4, 5, 6 };
  vector<int> v2(v1.size() - 2);
  vector<int> ::iterator it = remove_if(v1.begin(), v1.end(), [](int& date) {return date % 2 == 0; });
  //将所有的偶数覆盖,当然也不是真正意义上的删除,只是单纯的数据覆盖,容器的元素个数不变
  for_each(v1.begin(), v1.end(), [](int& date) {cout << date << " ";});
  cout << endl;
  //真正意义上的删除
  auto it1 = remove_copy_if(v1.begin(), v1.end(), v2.begin(), [](int& date) {return date % 2 == 0; });
  for_each(v2.begin(), v2.end(), [](int& date) {cout << date << " "; });
  return 0;
}

修改类算法

1.replace 修改

2. replace_copy 修改结果另存

3.replace_if 条件替换

4.replace_copy_if 条件替换,结果另存

5.iter_swap 迭代器交换

6.swap 容器交换

7.swap_range 区间交换

8.unique: 去重操作

unique_copy: 去重结果另存

replace与replace_copy

replace 前两个参数是迭代器范围,第三个参数是容器中要被替换的数据,第四个参数是数据
replace_copy 结果另存,就加了个另存容器的初位置
#include<iostream>
#include<functional>
#include<algorithm>
#include<vector>
#include<array>
using namespace std;
int main()
{
  vector<int> v1 = { 1, 2, 3,4, 5, 6 };
  vector<int> v2(v1.size());
  replace(v1.begin(), v1.end(), 1, 99);
  copy(v1.begin(), v1.end(), ostream_iterator<int>(cout, " "));
  cout << endl;
  replace_copy(v1.begin(), v1.end(), v2.begin(), 2, 888);
  copy(v2.begin(), v2.end(), ostream_iterator<int>(cout, " "));
  return 0;
}

replace_if与replace_copy_if

也就是一个条件替换,条件和一个条件替换另存

#include<iostream>
#include<functional>
#include<algorithm>
#include<vector>
#include<array>
using namespace std;
int main()
{
  vector<int> v1 = { 1, 2, 3,4, 5, 6 };
  vector<int> v2(v1.size());
  replace_if(v1.begin(), v1.end(), [](int& date) {return date % 2 == 0; }, 99);
  copy(v1.begin(), v1.end(), ostream_iterator<int>(cout, " "));
  cout << endl;
  replace_copy_if(v1.begin(), v1.end(), v2.begin(), [](int& date) {return date % 2 == 0; }, 888);
  copy(v2.begin(), v2.end(), ostream_iterator<int>(cout, " "));
  return 0;

iter_swap与swap与swap_range、

#include<iostream>
#include<vector>
#include<functional>
#include<algorithm>
#include<list>
using namespace std;
int main()
{
  //iter_swap  迭代器的交换  就是将迭代器中元素的位置进行交换
  //注意;在list容器中,如果用 end() -1 会报错
  //这个时候,为了解决这一个问题,可以采用  advance()函数,将元素移动 -1个距离
  //advance的第一个参数是迭代器类型的位置,第二个参数是移动的距离,可以为负数
  list<int> list1 = { 1, 2, 3, 4, 5 };
  list<int> ::iterator it = list1.end();
  advance(it, -1);
  iter_swap(list1.begin(), it);
  copy(list1.begin(), list1.end(), ostream_iterator<int>(cout, " "));
  cout << endl;
  // swap 迭代器交换
  //参数为2个容器的对象
  list<int> list2 = { 99, 99, 2 };
  cout << "交换前 :";
  copy(list1.begin(), list1.end(), ostream_iterator<int>(cout, " "));
  cout << endl;
  copy(list2.begin(), list2.end(), ostream_iterator<int>(cout, " "));
  cout << endl;
  swap(list1, list2);
  cout << "交换后 :";
  copy(list1.begin(), list1.end(), ostream_iterator<int>(cout, " "));
  cout << endl;
  copy(list2.begin(), list2.end(), ostream_iterator<int>(cout, " "));
  //swap_ranges  区间交换
  cout << endl;
  vector<int> v1 = { 1,23, 4, 5 };
  vector<int> v2 = { 9, 8 , 7, 6, 5, 4, 3, 2, 1 };
  swap_ranges(v1.begin(), v1.begin() + 2, v2.begin());
  for (auto& v : v1)
  {
    cout << v << " ";
  }
  cout << endl;
  for (auto& v : v2)
  {
    cout << v << " ";
  }
  return 0;
}

unique与unique_copy

#include<iostream>
#include<vector>
#include<functional>
#include<algorithm>
#include<list>
using namespace std;
int main()
{
  // unique 去重
  // 注意:这个函数去重,感觉其实挺鸡肋的,因为它不能够将所有元素去重,只能够实现部分去重
  vector<int> v1 = { 1, 1, 3,4 ,4, 4, 4, 4, 4,5 ,5 ,6 ,6 ,7, 8, 8 };
  unique(v1.begin(), v1.end());
  for (auto& v : v1)
  {
    cout << v << " ";
  }
  //unique_copy
  //unique_copy倒是可以实现所有元素去重
  //不过去重的元素必须是要有序的,不然就会报错
  vector<int> v2 = { 1, 1, 3,4 ,4, 4, 4, 4, 4,5 ,5 ,6 ,6 ,7, 8, 8 };
  vector<int> v3(v2.size());
  cout << endl;
  unique_copy(v2.begin(), v2.end(), v3.begin());
  for (auto& v : v3)
  {
    cout << v << " ";
  }
  return -0;
}


相关文章
|
22天前
|
存储 算法 Java
Set接口及其主要实现类(如HashSet、TreeSet)如何通过特定数据结构和算法确保元素唯一性
Java Set因其“无重复”特性在集合框架中独树一帜。本文解析了Set接口及其主要实现类(如HashSet、TreeSet)如何通过特定数据结构和算法确保元素唯一性,并提供了最佳实践建议,包括选择合适的Set实现类和正确实现自定义对象的hashCode()与equals()方法。
31 4
|
26天前
|
算法 数据处理 C++
c++ STL划分算法;partition()、partition_copy()、stable_partition()、partition_point()详解
这些算法是C++ STL中处理和组织数据的强大工具,能够高效地实现复杂的数据处理逻辑。理解它们的差异和应用场景,将有助于编写更加高效和清晰的C++代码。
20 0
|
3月前
|
搜索推荐 算法 Java
现有一个接口DataOperation定义了排序方法sort(int[])和查找方法search(int[],int),已知类QuickSort的quickSort(int[])方法实现了快速排序算法
该博客文章通过UML类图和Java源码示例,展示了如何使用适配器模式将QuickSort类和BinarySearch类的排序和查找功能适配到DataOperation接口中,实现算法的解耦和复用。
32 1
现有一个接口DataOperation定义了排序方法sort(int[])和查找方法search(int[],int),已知类QuickSort的quickSort(int[])方法实现了快速排序算法
|
3月前
|
数据采集 算法 数据可视化
基于K-Means聚类算法对球员数据的聚类分析,可以自主寻找最优聚类数进行聚类
本文介绍了一个基于K-Means聚类算法的NBA球员数据分析项目,该项目通过采集和分析球员的得分、篮板、助攻等统计数据,使用轮廓系数法和拐点法确定最优聚类数,将球员分为不同群组,并提供了一个可视化界面以便直观比较不同群组的球员表现。
基于K-Means聚类算法对球员数据的聚类分析,可以自主寻找最优聚类数进行聚类
|
4月前
创建KNN类
【7月更文挑战第22天】创建KNN类。
31 8
|
4月前
|
算法 数据库
|
5月前
|
数据采集 算法 安全
CVPR 2024:给NeRF开透视眼!稀疏视角下用X光进行三维重建,9类算法工具包全开源
【6月更文挑战第28天】CVPR 2024亮点:SAX-NeRF框架开源!融合X光与NeRF,提升3D重建效果。X3D数据集验证,Lineformer+MLG策略揭示物体内部结构,增强几何理解。虽有计算成本及泛化挑战,但为计算机视觉和医学影像开辟新路径。[论文链接](https://arxiv.org/abs/2311.10959)**
158 5
|
5月前
|
算法 前端开发 Linux
【常用技巧】C++ STL容器操作:6种常用场景算法
STL在Linux C++中使用的非常普遍,掌握并合适的使用各种容器至关重要!
89 10
|
4月前
|
算法 C++
STL算法大全
以上只是一部分STL算法的简单概述,每一个算法都有其特定的使用场景和规则,具体使用时需要参考相关文档或者教程进行深入理解和学习。
31 0
|
4月前
|
机器学习/深度学习 算法 搜索推荐