今天刚刚学习了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我还知之甚少 还需要在今后的学习中不断掌握
这个寒假又是一个繁忙的寒假 希望我在这个短暂仓促却又温暖充实的假期中能长进良多
—— 渐黄昏,清角吹寒,都在空城