C++(STL)学习笔记

【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);

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值