C++——STL的set与map简单使用

set容器

set< int > sset< int, less< int > () > s等价是默认升序排列,如果要降序的话可以这样写
set< int, greater< int >() > s;
但是要写头文件functional
还可以自己写排序规则

1、set是有顺序的集合,其中没有重复元素
2、迭代器命名方式:
set< int >::iterator it = set.begin();
3、set.count(data)用于判断data是否为其中的元素如果是则返回1
4、set.empty()判断集合是否为空,如果为空返回1
5、set.find(data)返回数据data的迭代器,如果没有这个数据则返回最后一个数据的迭代器的下一个位置
6、set.erase(T)表示删除迭代器T指向的数据
set.erase(data)表示删除数据data
set.erase(T,K)表示删除迭代器T到K的数据不删除K
set.erase(find(data1), find(data2))删除data1到data2之间的元素但不包括data2
7、set.insert(data) 插入元素
8、set.max_size() 返回能存储最大的数据量
9、set.size() 返回当前元素的个数
10、s1.swap(s2)两个集合的交换
11、set.clear() 清空
在从小到大的set中
12、set.lower_bound(data)返回第一个比data大或者相等的数据的迭代器,如果没有返回set.end()
13、set.upper_bound(data)返回第一个比data大的数据的迭代器,如果没有返回set.end()
在从大到小的set中 即set<int, greater< int > >
14、 set.lower_bound(data)返回第一个比data小或者相等的数据的迭代器,如果没有返回set.end()
15、set.upper_bound(data)返回第一个比data小的数据的迭代器,如果没有返回set.end()
例题:Andy’s First Dictionary
题意:用小写输出每一种单词,重复的只输出一次,不区分大小写

#include<iostream>
#include<sstream>
#include<cstring>
#include<algorithm>
#include<set>
using namespace std;
string s;
string mid;
set<string> ans;
int main()
{
	while(cin >> s)
	{
		for(int i = 0; i < s.length() ; i++)
		if(isalpha(s[i]))
		s[i] = tolower(s[i]);
		else
		s[i] = ' ';
		stringstream ss;
		ss << s;
		while(ss >> mid)
		ans.insert(mid); 
	}
	for(set<string>::iterator it = ans.begin() ; it != ans.end() ; it++)
	cout << *it << endl;
	return 0;
}

map容器

map将两个元素关联起来形成键值对(key-value)可以理解为关联数组
比如
map< string, int , op > mp 将字符串和数字关联起来,可以记录这个字符串出现的次数,第二个可以修改第一个不能修改,map容器与set容器一样,会自动排序,默认key值升序排序
可以用第一个来访问和修改第二个的值,如:
mp[string]++;
初始化
mp.insert(pair<string, int>(‘a’, 10));
mp.insert(make_pair<“hello”, 10>);
mp.insert(map<string, int>::value_type(“hello”, 10));
mp[hello] = 10;
mp.size();//有多少个键值对
加上例题
Ananagrams

题意:找出文章中不能通过重新组合变成另外一个词的词

#include<iostream>
#include<cstring>
#include<algorithm>
#include<vector> 
#include<map>
using namespace std;
string s;
map<string, int> word;//记录标准化以后的string 和数目 
vector<string> ans;//记录答案 
vector<string> s2;//记录原始数据(单词) 
string standard(string s1)//标准化,按字典序排序 便于比较 
{
	for(int i = 0; i < s1.length() ; i++)
	{
		s1[i] = tolower(s1[i]);
	}
	sort(s1.begin() , s1.end() );
	return s1;
}
int main()
{
	while(cin >> s && s[0] != '#')
	{
		s2.push_back(s);
		s = standard(s);
		word[s] ++;
	}
	for(int i = 0; i < s2.size(); i++)
	{
		if(word[standard(s2[i])] == 1)//如果只出现过一次就存进答案数组 
		ans.push_back(s2[i]);
	}
	sort(ans.begin(), ans.end());
	for(vector<string>::iterator it = ans.begin(); it != ans.end(); it++)
	{
		cout << *it << endl;
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/yezi_coder/article/details/104212370