stl algorithm -- sort ,unique

在写私信群聊代码的时候碰到怎么把一个vector<Int> 元素unique化的问题,基本上就是需要下面这么做,用<algorithm>中的,先sort再unique

 1 #include <algorithm>
 2 #include <iostream>
 3 #include <vector>
 4 #include <stdio.h>
 5 using namespace std;
 6 void print(vector<int>& vec);
 7 int main(){
 8     int a[] = {1,3,4,4,6,3,2,5,6,2};
 9     vector<int> vec(a, a+10);
10     print(vec);
11     vector<int>::iterator it;
12     sort(vec.begin(), vec.end());
13     print(vec);
14     it = unique(vec.begin(), vec.end());
15 //    printf("%p\n", &vec);
16     vec.resize(it-vec.begin());
17 //    printf("%p\n", &vec);
18     print(vec);
19     printf("%p\n", &vec);
20     vec.resize(23, 22);
21     printf("%p\n", &vec);
22     print(vec);
23 
24 }
25 void print(vector<int>& vec){
26     for(vector<int>::iterator it = vec.begin(); it != vec.end(); it++){
27         cout << *it << "  ";
28     }
29     cout << endl;
30 }

运行结果 :

1 3 4 4 6 3 2 5 6 2
1 2 2 3 3 4 4 5 6 6
1 2 3 4 5 6
0x7fffa2daab30
0x7fffa2daab30
1 2 3 4 5 6 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22

 

注意20行的 resize,  resize是sequence containers(vector, list, deque)共有的一个方法,它把vector扩展或缩小到参数指定的那么大,从20行可以看到它可以带2个参数,第二个指定如果扩展的话要复制过去的对象, 可以看到resize之后vector的地址是不变的,即使是扩大,注意19行输出地址的方式, "%p"意味着要接一个void*型的参数

有些方法是某种container所特有的,比如list自己就有sort,它还自己定义了几种算法,unique,merge,reverse,只有list有,可能是它自身特性决定的吧,它自己来实现比一般性的algorithm来得好, vector所特有的是capacity, reserve   参考http://www.cplusplus.com/reference/stl/

 

2  试着写下上面unique的实现算法,sort的我没有写出来

 1 #include<iostream>
 2 #include<vector>
 3 #include<algorithm>
 4 using namespace std;
 5 void print(vector<int>& vec);
 6 template <class InputIterator>
 7 InputIterator unique_wy(InputIterator begin, InputIterator end){
typename iterator_traits<InputIterator>::value_type value = *begin;
cout << "in unique wy *begin = " << value << endl;
8 InputIterator last = begin; 9 while(++begin != end){ 10 if (*last != *begin){ 11 *++last = *begin; 12 } 13 } 14 return ++last; 15 } 16 int main(){ 17 int a[] = {1,1,2,2,4,6,7,7,4}; 18 vector<int> vec(a, a+9); 19 print(vec); 20 // sort_wy(vec.begin(), vec.end()); 21 // print(vec); 22 vector<int>::iterator it = unique_wy(vec.begin(), vec.end()); 23 vec.resize(it-vec.begin()); 24 print(vec); 25 return 0; 26 } 27 void print(vector<int>& vec){ 28 for(vector<int>::iterator it = vec.begin(); it != vec.end(); it++){ 29 cout << *it << " "; 30 } 31 cout << endl; 32 }

运行结果:

1 1 2 2 4 6 7 7 4
in unique_wy *begin = 1
1 2 4 6 7 4

本来我想把sort也写上去,算法不过关,没写出来。 去<stl_algo.h>的源码中看了点sort源码,sort有一系列的实现及辅助函数, 里面的参数都命名的是 RandomIterator.      这里引出了<algorithm>中算法的实现了,<algorithm>中都是function template,这是针对未知的iterator实现的算法,只要传进去的iterator满足相应的要求, 注意上面7,8行之间的代码,是如何使用iterator_traits<InputInterator>的,在<algorithm>中要使用iterator(通过模板参数传进来的类型)相关的几个type,都是这么用的

 

3 <iterator>

从上面的可以看出,自己定义的iterator若要被stl algorithm所使用,则必须按照iterator_traits中要求的定义那5个type, 当然也可以不自己定义,从 struct iterator{}派生,它会帮我们定义这些类型,<iterator>中还定义了5个空struct,有简单的派生关系input_iterator_tag, bidirectional_iterator_tag, random_access_iterator_tag   http://www.cplusplus.com/reference/std/iterator/ , 在从struct iterator{}派生的时候,必须给它传两个参数, 指向的type,和这五个之一的 catagory type,  从前述的那个文档中我们可以看到5个iterator catogory必须要支持哪些operator, 即必须重载了哪些operator. 虽然下面的例子是从iterator<>派生来提供5个预定义的类型,但我看c++/4.6实现的源码,stl_list.h中的 _List_iterator是直接在其中实现的,没有从iterator<>派生

1 class WyList;
2 class WyListIterator: public iterator<random_access_iterator_tag,  WYList> {
3     //一系列的operator overloading    bool operator==(WY&, WY&);
4    // WyListIterator&  operator++(){}  ; 
5    // WyListIterator  operator++(int){} ; 
6    //WyListIterator  operator+(int n){};
7    // typename iterator_traits::value_type operator[](int n) { };
8 }

以上写得很简单,本来想可以去模拟一下 std  list的实现,  注意2行中从iterator派生时的用法,传入的参数,自己定义的WyListIterator是一个类,并不是模板,这也就是container的实现者自己来实现自己的iterator的表现  另外注意4,5行重载实现 ++WyListIterator 和WyListIterator++时返回值的不同,体现了这前置和后置++的不同,一个对自己操作后返回自己,一个先copy自己,然后再把自己++,然后返回之前的自己

转载于:https://www.cnblogs.com/livingintruth/archive/2012/06/11/2543418.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/475114.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

oracle scn隐藏参数,Oracle隐含参数scn不一致启动

Oracle隐含参数&#xff1a;allow_resetlogs_corruption的使用提示&#xff1a;Oracle的隐含参数只应该在测试环境或者在Oracle Support的支持下使用orOracle隐含参数&#xff1a;allow_resetlogs_corruption的使用提示&#xff1a;Oracle的隐含参数只应该在测试环境或者在Orac…

LeetCode 298. 二叉树最长连续序列(自顶向下)

文章目录1. 题目2. 解题1. 题目 给你一棵指定的二叉树&#xff0c;请你计算它最长连续序列路径的长度。 该路径&#xff0c;可以是从某个初始结点到树中任意结点&#xff0c;通过「父 - 子」关系连接而产生的任意路径。 这个最长连续的路径&#xff0c;必须从父结点到子结点…

LeetCode 159. 至多包含两个不同字符的最长子串(滑动窗口)

文章目录1. 题目2. 解题1. 题目 给定一个字符串 s &#xff0c;找出 至多 包含两个不同字符的最长子串 t &#xff0c;并返回该子串的长度。 示例 1: 输入: "eceba" 输出: 3 解释: t 是 "ece"&#xff0c;长度为3。示例 2: 输入: "ccaabbb" 输…

linux nginx 图片服务器,搭建Nginx图片服务器(Linux)

wget http://nginx.org/download/nginx-1.19.1.tar.gzyum install gcc-cyum install -y pcre pcre-develyum install -y zlib zlib-develyum install -y openssl openssl-devel进入nginx目录./configure --prefix/usr/local/nginx --pid-path/var/run/nginx/nginx.pid --loc…

LeetCode 163. 缺失的区间

文章目录1. 题目2. 解题1. 题目 给定一个排序的整数数组 nums &#xff0c;其中元素的范围在 闭区间 [lower, upper] 当中&#xff0c;返回不包含在数组中的缺失区间。 示例&#xff1a;输入: nums [0, 1, 3, 50, 75], lower 0 和 upper 99, 输出: ["2", "…

linux chmod修改权限失败,【Linux】chmod修改文件权限

在Linux系统中输入chmod -- help 输出如下&#xff1a;lilinchuanlilinchuan-VPCEA27EC:~$ chmod --help用法&#xff1a;chmod [选项]... 模式[,模式]... 文件...或&#xff1a;chmod [选项]... 八进制模式 文件...或&#xff1a;chmod [选项]... --reference参考文件 文件...…

小白学数据分析-----聚类分析理论之TwoSteps理论篇+实践篇

昨天分享了以前学习的聚类分析算法K-Means的部分知识&#xff0c;其实这个主要是了解一下这个算法的原理和适用条件就行了&#xff0c;作为应用而不是作为深入研究&#xff0c;能够很好的将业务和算法模型紧密结合的又有几人呢&#xff1f;所以一些基本知识还是很必要的&#x…

LeetCode 244. 最短单词距离 II(哈希map+set二分查找)

文章目录1. 题目2. 解题2.1 暴力超时2.2 哈希表set二分查找1. 题目 请设计一个类&#xff0c;使该类的构造函数能够接收一个单词列表。 然后再实现一个方法&#xff0c;该方法能够分别接收两个单词 word1 和 word2&#xff0c;并返回列表中这两个单词之间的最短距离。 您的方法…

Linux查看指定进程占用mem,Linux查看占用mem的进程脚本

#!/bin/bash############################################################################### 脚本功能 &#xff1a; 列出正在占用mem的进程。Rss&#xff1a;物理内存Swap&#xff1a;虚拟内存#########################################################################…

从根本上解决 Infopath 2010 重复表的序号问题

经过多长期的查找资料&#xff0c;今天终于找到如何解决Infopath 重复表序号的问题&#xff0c;其实也很简单只用Xpath 语法就可以了 count(../preceding-sibling::*[local-name() "ExpensiveDetail"])1 ExpensiveDetail 是重复表的名字 转载于:https://www.cnblog…

linux怎么将进程调优到8,Linux的性能调优命令

性能调优一直是运维工程师最重要的工作之一&#xff0c;如果您所在的生产环境中遇到了系统响应速度慢&#xff0c;硬盘IO吞吐量异常&#xff0c;数据处理速度低于预期值的情况&#xff0c;又或者如CPU、内存、硬盘、网络等系统资源长期处于耗尽的状态&#xff0c;那么这篇文章将…

LeetCode 161. 相隔为 1 的编辑距离(DP/遍历)

文章目录1. 题目2. 解题2.1 DP超时2.2 一次遍历1. 题目 给定两个字符串 s 和 t&#xff0c;判断他们的编辑距离是否为 1。 注意&#xff1a; 满足编辑距离等于 1 有三种可能的情形&#xff1a; 往 s 中插入一个字符得到 t从 s 中删除一个字符得到 t在 s 中替换一个字符得到 …

Google搜索图片时只显示第一页

用Google搜索图片时出现&#xff0c;只显示第一页&#xff0c;其他页不能显示。 Method 1:未成功。 Method 2:成功。 结果图&#xff1a; 转载于:https://www.cnblogs.com/yfl-IT/archive/2012/06/19/2555429.html

pxe自动部署Linux,Kickstart+PXE自动部署CentOS6.6

生产环境中对于部署大量的相同系统的服务器&#xff0c;如果逐台安装操作系统的话是非常浪费时间的工作&#xff0c;还好CentOS提供了无人值守安装系统的功能&#xff0c;下面就详细介绍一下配置步骤。一、配置本机的yum源因为需要安装一些软件来达到我们的目的&#xff0c;所以…

LeetCode 247. 中心对称数 II(DP)

文章目录1. 题目2. 解题1. 题目 中心对称数是指一个数字在旋转了 180 度之后看起来依旧相同的数字&#xff08;或者上下颠倒地看&#xff09;。 找到所有长度为 n 的中心对称数。 示例 : 输入: n 2 输出: ["11","69","88","96"]来…

重新排列参数

重新排列参数 重新排列参数操作可以使你重新排列方法、索引器中的参数。你将方法的参数重新排列后&#xff0c;所有使用该方法的地方都会相应调整。以下面代码为例&#xff1a; class Person{public void Print(string name, int age, bool sex){}}class Program{static void M…

linux的accept函数源码,accept函数

13.2.5 accept函数处于监听状态的服务器在获得客户机的连接请求后&#xff0c;会将其放置在等待队列中。当系统空闲时&#xff0c;将接受客户机的连接请求。接收客户机的连接请求使用accept函数&#xff0c;该函数的具体信息如表13.6所示。表13.6 accept函数头文件函数形式i…

C# WebBrower1控件提示“该文档已被修改,是否保存修改结果”解决方法 .

C# WebBrower1控件可编辑模式保存时会提示“该文档已被修改&#xff0c;是否保存修改结果”在百度查了不少方法&#xff0c;张筱祥发现一个比较实用而且非常简单的方法&#xff0c;代码如下&#xff1a;在WebBrower1的Navigating 事件中加以下代码就没有提示了。private void w…

LeetCode 251. 展开二维向量

文章目录1. 题目2. 解题1. 题目 请设计并实现一个能够展开二维向量的迭代器。该迭代器需要支持 next 和 hasNext 两种操作。、 示例&#xff1a; Vector2D iterator new Vector2D([[1,2],[3],[4]]);iterator.next(); // 返回 1 iterator.next(); // 返回 2 iterator.next();…

linux添加中文字库主线任务,Linux 添加中文字体库

背景&#xff1a;润乾报表 win上面的项目直接上传到linux 上&#xff0c;但预览&下载报表时乱码如果含有斜线的单元格或统计图的报表在网页上发布时&#xff0c;统计图或斜线单元格里的汉字会变成小方框&#xff0c;此时往往是服务器端操作系统的中文安装包没有装全&#x…