1185:单词排序&&unique函数&&去重排序

#include<bits/stdc++.h>
using namespace std;
#define N 105
int main()
{
	string s[N];
	int n = 1;
	while(cin >> s[n])//这个可以getline,后面sort用string中的begin和end确定
        n++;
    n--;//最后一次输入的值是EOF,不是有效的值,n应该减1 
	sort(s+1, s+1+n); 
	cout << s[1] << endl;
	for(int i = 2; i <= n; ++i)
	    if(s[i] != s[i-1])
            cout << s[i] << endl; 
	return 0;
}

注意:字符串比较可以直接比较用关系运算符。
这里要说的是去重和排序同时出现的情况。
先排序再去重
一般用sort排序,当然还有桶排序等,关键是去重
一种是用bool型对每个出现的数字注意是数字进行true,后面根据真值来输出,当然这里也可以在此时进行计数操作,用于统计某样出现次数
另一种是字符或者说string类一般对于有空格的输入,用getline(cin,s)(string库)要进行排序,要对空格剔除,有stringstream和while(cin)
对于去重有个unique函数,可以把相等的放在后面,可以设置一个哨兵来记录相等数的数字位置,根据这个输出。
注意:unique 函数只能去除相邻的重复元素。如果容器中的重复元素不是相邻的,需要先对容器进行排序,再使用 unique 函数。
不用unique函数,对于去重,若是循环遍历,时间花费太高,对于发现后删除也是比较麻烦和花销大。
于是
可以通过比较的形式,当然是排序后的,对于第一元素输出,后面比较相邻值。
还有个要点:就是分割,while操作就是在以空格分割。

unique 函数介绍:unique 是 C++ 标准库 头文件中的一个函数模板。它的作用是去除容器中相邻的重复元素,将不重复的元素移到容器的前面部分,最后返回一个指向新的逻辑结尾的迭代器。
工作原理:unique 函数会遍历 words.begin() 到 words.end() 这个范围内的元素,比较相邻的元素。如果相邻元素相同,它会将后面重复的元素覆盖掉,只保留第一个出现的元素。这个过程不会改变容器的大小,只是将不重复的元素依次排列在容器的前面,而后面会留下一些多余的元素。
返回值:unique 函数返回一个迭代器 last,它指向新的逻辑结尾,即去重后不重复元素序列的下一个位置。

【题目描述】
输入一行单词序列,相邻单词之间由1个或多个空格间隔,请按照字典序输出这些单词,要求重复的单词只输出一次。(区分大小写)

【输入】
一行单词序列,最少1个单词,最多100个单词,每个单词长度不超过50,单词之间用至少1个空格间隔。数据不含除字母、空格外的其他字符。

【输出】
按字典序输出这些单词,重复的单词只输出一次。

【输入样例】
She wants to go to Peking University to study Chinese
【输出样例】
Chinese
Peking
She
University
go
study
to
wants
#include<bits/stdc++.h> using namespace std; int main ( ) { int n; set<string> s; string str; while(cin>>str){ s.insert(str); } for(set<string>::iterator it=s.begin();it!=s.end();++it){ cout<<*it<<endl; } return 0; }
一、什么是 set?
集合(set)是一个内部自动有序且不含重复元素的容器,它可以在需要删除重复元素的情况下大放异彩,节省时间,减少思维量。

set 就是关键字的简单集合,当只是想知道一个值是否存在时,set 是最有用的。set 内部采用的是一种非常高效的平衡检索二叉树 :红黑树(Red-Black Tree),也称为 RB 树,RB 树的统计性能要好于一般平衡二叉树。在 set 中每个元素的值都唯一,而且系统能根据元素的值自动进行排序,set 中元素的值不能直接被改变。

顺序容器包括 vector、deque、list、forward_list、array、string,所有顺序容器都提供了快速顺序访问元素的能力;关联容器包括 set、map。

posted @ 2026-03-19 11:39  Szy111  阅读(6)  评论(0)    收藏  举报