【1】.不定长数组:vector(在头文件vector中)(元素可以重复哦)
vector是一个模板类,声明方式:vector<int>a或者vector<double>a. Vector<int>是一个类似于inta[]的整数数组,而vector<string>就是一个类似于 string a[ ]的字符串数组
用法:可以用a.size( )返回实际元素的个数,a.resize( )改变大小,a.insert(position,ch)在指定位置插入一个或多个元素,a.push_back( )向尾部添加元素,a.pop_back( )删除最后一个元素,用clear( )清空,resize( ) 改变大小,用empty( )测试是否为空,erase()移除一个或一段元素,capacity()返回当前容量,reserve()增加容量,emplace()在指定位置生成一个元素(作用效果类似于insert,但两者的作用方式不同,emplace是直接在位置上构造一个元素,insert就是先构造再复制(或移动)过去数组中)。
数组初始化: vector<int>a(20,1); 定义一个含20个元素的数组,且每个元素值都为1
【2】集合set(在头文件set中)
set就是数学上的集合——每个元素最多只出现一次。
通过一道例题来学习
例题5-3 安迪的第一个字典(Andy's First Dictionary,Uva 10815) 输入一个文本,找出所有不同的单词(连续的字母序列),按字典序从小到大输出。单 词不区分大小写。
样例输入: Adventures in Disneyland Two blondes were going to Disneyland when they came to a fork in the road. The sign read: "Disneyland Left." So they went home.
样例输出(为了节约篇幅只保留前5行): a adventures blondes came disneyland
#include<iostream>
#include<string>
#include<set>
#include<sstream>//<sstream>库定义了三种类istringstream、ostringstream和stringstream
//分别用来进行流的输入、输出和输入输出操作
using namespace std;
set<string> dict; //string类型集合dict
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]);//将大写转化为小写
else s[i] = ' ';
stringstream ss(s);//ss是创建的流,
//(s)指往流ss中输入字符串s,因为s包含了空格,不能用ss<<s
while(ss >> buf) //把流中的值一个一个输出到buf中
dict.insert(buf);//往dict中一个一个插入buf
}
for(set<string>::iterator it = dict.begin(); it != dict.end(); ++it)
// 注意end()是dict的最后一个元素的下一个位置
cout << *it << "\n";
return 0;
}
iterator的意思是迭代器,是STL中的重要概念,类似于指针。和“vector类似于数组”一样,这里的“类似”指的是用法类似
max_size(), 返回set容器可能包含的元素最大个数
size() ,返回当前set容器中的元素个数
还有:在多次输入和输出流前最好先clean()
可以实现类型的转换:int a; ss<<"456"; ss>>a; cout<<a; 输出456
char a[8]; ss<<7777; ss>>a; cout<<a; 输出7777
#include<iostream>
#include<string>
#include<set>
using namespace std;
int main() {
set<int>s1;
set<int>::iterator it;
for (int i = 1; i < 5; i++)
{
s1.insert(i);
}
int a[] = { 1,2,3,4 };
set<int>s2(a, a + 4);//向流s2中输入数组a中的4个元素
for(it=s2.begin();it!=s2.end();it++)//end()指最后一个元素的下一个位置
{
cout << *it<<" ";
}
if ((it = s1.find(5)) != s1.end())cout << *it;
//如果找不到()中的数字则返回end()的位置
return 0;
}
【3】map (头文件在map中)(元素不重复)
map就是从键(key)到值(value)的映射。(map<key,value>a;)因为重载了[ ]运算符,map像是数组的“高 级版”。例如可以用一个mapmonth_name来表示“月份名字到月份编号”的映射, 然后用month_name["July"]=7这样的方式来赋值 。 (默认对key值进行字典排序,从小到大,例如key为a的排在key为b的前面)
例题5-4 反片语(Ananagrams,Uva 156)
输入一些单词,找出所有满足如下条件的单词:该单词不能通过字母重排,得到输入文 本中的另外一个单词。在判断是否满足条件时,字母不分大小写,但在输出时应保留输入中 的大小写,按字典序进行排列(所有大写字母在所有小写字母的前面)。
样例输入: ladder came tape soon leader acme RIDE lone Dreis peat ScAlE orb eye Rides dealer NotE derail LaCeS drIed noel dire Disk mace Rob dries #
样例输出: Disk NotE derail drIed eye ladder soon
#include<iostream>
#include<string>
#include<cctype>
#include<vector>
#include<map>
#include<algorithm>
using namespace std;
map<string,int> cnt;
vector<string> words;
//将单词s进行“标准化”
string repr(const string& s) {
string ans = s;
for(int i = 0; i < ans.length(); i++)
ans[i] = tolower(ans[i]);//转为小写字母
sort(ans.begin(), ans.end());
return ans;
}
int main() {
int n = 0;
string s;
while(cin >> s) //一直接受一个字符串,遇“空格”、“TAB”、“\n”就结束当前字符串输入
{
if(s[0] == '#') break;
words.push_back(s);
string r = repr(s);
if(!cnt.count(r)) cnt[r] = 0;//count(key)key是键值,若cnt中无key则返回0
cnt[r]++;
}
vector<string> ans;
for(int i = 0; i < words.size(); i++)
if(cnt[repr(words[i])] == 1) ans.push_back(words[i]);
sort(ans.begin(), ans.end());//因为没有第三个参数cmp,默认从小到大排序
for(int i = 0; i < ans.size(); i++)
cout << ans[i] << "\n";
return 0;
}
对于sort函数,位于algorithm头文件中,sort(数组开始位置,数组结尾位置,cmp) 如果想实现从大到小排序,自定义一个
bool cmp(int a,int b);