【日常学习】【语法】STL之set

今天刚刚学习了set 在我写这篇文章之前 请允许我首先对TY菌表示诚挚的感激 请教TY菌之前我眼里ruka简直不知所云TUT

set是一个集合 和康托前辈的一样 集合中的元素不重复 且集合中的元素是有序的(自动有序化) TY菌介绍说其内部实质是一个平衡树

set不是数组 只能通过迭代器(iterator)把里面的元素倒出来 迭代器相当于是指针 扫描的是地址 因此输出的时候需要用*variation


声明:

需要用到头文件set

set<string> dict; 建立一个集合 其名为dict 基类型是string


常用函数:

dict.insert() 将括号里的变量放到集合中

dict.begin() dict.end()返回集合最初和最后的元素的地址

这是写这个例题用到的


在某书的最后函数附录里看到这些好像都是list模板函数 暂时还不清楚是怎么回事  

这次例题是Uva10815 - Andy's First Dictionary 安迪的第一个字典 大意是给你一段文字 把里面的单词按字典序排列 每个单词只出现一次

先放代码

#include<iostream>
#include<string>
#include<set>
#include<sstream>
using namespace std;

set<string> dict;//set up a set called dict-short for dictionary,and it's based on string type;

int main(){
	string s,buf;
	while (cin>>s){
		for (int i=0;i<s.length();i++)
		  if (isalpha(s[i])) s[i]=tolower(s[i]);//if it's an letter,turn it lowercase.Others turn space and use stringstream to leave it out=ignore it
		  else s[i]=' ';
		stringstream ss(s);
		while (ss>>buf) dict.insert(buf);//insert it into the set which is already in order,TYkon said it's a balanced tree inside
	}
	for (set<string>::iterator it=dict.begin();it!=dict.end();++it)//iterator just like a point,scan it from beginning to end and output
	  cout<<*it<<endl;//NOTICE output by point
	return 0;
}
还是英文注释不过看懂应该问题不大

isalpha()判断是否是字母 如果是就用头tolower()转换成小写 否则就转为空格 这样是为了字符串流重读入的时候能够把空格去掉

特别强调一下本例中出现的迭代器

for (set<string>::iterator it=dict.begin();it!=dict.end();++it)//iterator just like a point,scan it from beginning to end and output
	  cout<<*it<<endl;//NOTICE output by point

迭代器iterator相当于是个类型 it是一个变量 基类型是iterator 它从开始扫到结尾的前一个【据TY菌解释 像数组一样 最后一位是没有值的 数组是一个结束标志 不知集合最后是什么】输出的时候 由于it扫描的是地址 要输出*it


显然对于set我还知之甚少 还需要在今后的学习中不断掌握

这个寒假又是一个繁忙的寒假 希望我在这个短暂仓促却又温暖充实的假期中能长进良多 


—— 渐黄昏,清角吹寒,都在空城

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值