STLgrasp

use frequently STL grasp

string(字符串)

image-20200301145316036

所有的字符串函数都已经在上面了,下面列几个比较常用的函数:

vector(不定长数组)

1.导入函数库

#include<vector> using namespace std;

2.构造函数
vector<int> v1 ( nums,value);

nums:容量大小 value:值

3.赋值

v1 = v2;

如果v1的容量>=v2的容量,可以将v2的值copy到v1中

assign(start,end);

assign(num, value);

v1.assign(v2.begin(),v2.end()-5);

将v2 中第一个到倒数第五个的数赋值给v1

v1.assign(5,3)

给v1 赋5个值为3的值

4.运算符

v1 == v2;

​ 两个vectors被认为是相等的,如果:
​ 1.它们具有相同的容量
​ 2.所有相同位置的元素相等.

5.常用函数

image-20191109151510056

6.常用函数详解

  • back() 与 end()的区别

back()函数返回的是最后一个元素的值;

end()函数返回的是最后一个元素的下一个位置(返回类型:迭代器)

迭代器: 迭代器(iterator)是一种检查容器内元素并遍历元素的数据类型。
(1) 每种容器类型都定义了自己的迭代器类型,如vector:
vector::iterator iter;这条语句定义了一个名为iter的变量,它的数据类型是由vector定义的iterator类型。

每个不同的容器有不同迭代器,相当于不同容器内的指针

end()与迭代器(iterator)的应用:

vector<int> a;
vector<int>::iterator ite;
ite = a.end()-1; //只想最后一个元素的位置
cout<<*ite<<endl;//输出最后一个元素的值
//将迭代器当做一个指针使用就行了
/* begin() 和 end() 返回值也是一个迭代器,可以配合应用于对数组的遍历*/
for(vector<int>::iterator i = a.begin();i !+ a.end(); i++){
    cout<<*i<<' ';
}

map(映射)

map是一类关联式容器。它的特点是增加和删除节点对迭代器的影响很小,除了那个操作节点,对其他的节都没有什么影响。

对于迭代器来说,可以修改实值,而不能修改key。

函数:

image-20200301163611869

例题:反片语(Ananagrams, Uva 156)

题目:输入一些单词,找出所有满足如下条件的单词:该单词不能通过字母重排,得到输入文本中的另外一个单词。在判断是否满足条件时,字母不分大小写,但在输出时应保留输入中的大小写,按字典序进行排列(所有大写字母在所有小写字母的前面)。

/* 题目:输入一些单词,找出所有满足如下条件的单词:该单词不能通过字母重排,得到输入文本中的另外一个单词。
 * 在判断是否满足条件时,字母不分大小写,
 * 但在输出时应保留输入中的大小写,按字典序进行排列(所有大写字母在所有小写字母的前面)。
 */
#include<iostream>
#include<string>
#include<vector>
#include<map>
#include<algorithm>
using namespace std;

map<string,int> id;
vector<string> page;

//标准化,将所有的单词都转化为小写,并按照顺序排列,如果一个单词由相同字母组成,就会产生重复
string standar(string str){
    string ans = str;
    for(int i = 0; i < ans.length();i++){
        ans[i] = tolower(ans[i]);
    }
    sort(ans.begin(),ans.end());
    return ans;
}

int main(){
    //input
    string str;
    
    while(cin>>str){
        if(str[0] == '#') break;
        //将所有的单词都存进去数组里面
        page.push_back(str);
        //如果map里面原本有这个元素就不会运行,如果没有设置为0进行初始化
        if(!id.count(standar(str)))id[str] = 0;
        //不管有没有都要加一
        id[standar(str)]++;
    }

    //输出格式,筛选
    vector<string> words;//新建一个动态数组存放符合输出条件的数据
    
    //遍历所输入的文章里面所有的单词。判断他们的标准化单词是否有重复,没有重复的存入数组
    for(int i = 0; i < page.size();i++){
        if(id[standar(page[i])] == 1) words.push_back(page[i]);
    }
    //因为要按照字母的顺序还有大小写来输出,所以将要输出的结果再一次排序
    //sort的排序是从小到大的
    sort(words.begin(),words.end());
    for(int i = 0; i < words.size(); i++){
        cout<<words[i]<<endl;
    }

    return 0;
}

这题表现了可以用数组的形式来使用map。第一个参数是key值,第二个参数是value值,输入key可以很快的寻找到value值,他们是一一对应的。形成映射的关系。

set(集合)

set集合是c++ STL库中自带的一个容器,set具有以下两个特点:

1、set中的元素都是排好序的

2、set集合中没有重复的元素

image-20200301154201512

举例常用的函数:

#include<stdio.h>
#include<set>
using namespace std;
int main()
{
	set<int>s;
	s.insert(3); 
	s.insert(1);
	s.insert(2);
	s.insert(1);
	set<int>::iterator it;            
	for(it=s.begin();it!=s.end();it++)  //使用迭代器进行遍历 
	{
		printf("%d\n",*it);
	}
	return 0;
}
//输出结果 : 1 2 3     一共插入了4个数,但是集合中只有3个数并且是有序的,可见之前说过的set集合的两个特点,有序和不重复。

当set集合中的元素为结构体时,该结构体必须实现运算符‘<’的重载

#include<iostream>
#include<set>
#include<string>
using namespace std;
struct people{
    string name;
    int age;
    bool operator<(const people p)const{//重载运算符
        return age<p.age;
        //这边 age 相当于小于号左边,p.age相当于小于号右边,如果左边小于右边return true,否则return false;
    }
};
int main(){
    set<people> s;
    s.insert({"张三",14});
	s.insert({"李四",16});
	s.insert({"王二麻子",10});
    set<people>::iterator it;
    for(it = s.begin(); it != s.end();it++){
        cout<<"name:"<<(*it).name<<"age:"<<(*it).age<<endl;
        //迭代器:用*it 来指定访问的元素,相当于指针,it指向对应的地址,*it获取对应地址的元素!
    }
    return 0;
}

algorithm(算法函数)

导入头文件

#include<algorithm>

1. Sort()函数

sort(start,end);

start:起始位置

end:结束位置

对 start 到 end 之间的数进行从小到大排序

例:

sort(a,a+10);

对a[0]到a[9]之间的数进行排序

sort(v1.begin(),v1.end());

end()返回的是最后一个数的地址+1

2. max() min()函数

1.头文件

#include<algorithm>

2.使用

max(int ,int);返回较大值

min(int ,int);返回较小值

3. unique()函数

该函数的作用是“去除”容器或者数组中相邻元素的重复出现的元素,注意
(1) 这里的去除并非真正意义的erase,而是将重复的元素放到容器的末尾,返回值是去重之后的尾地址。
(2) unique针对的是相邻元素,所以对于顺序顺序错乱的数组成员,或者容器成员,需要先进行排序,可以调用sort()函数

例:

int a[10] = {1,1,2,2,3,4,5,6,6,3};
unique(a,a+10);   //unique返回的是一个地址  a + 6

int end = unique(a,a+10) - a;   //end = 6
for (int i = 0; i < end; i++){
	cout<<a[i]<<' '<<endl;
}

**4. reverse()函数

  1. reverse(it, it2)可以将数组指针在[it, it2)之间的元素或容器的迭代器在[it, it2)范围内的元素
  2. 进行反转。示例如下:

image-20200301151918332

输出如下:

image-20200301151935722

对于容器间的迭代器同样如此迭代器:

image-20200301152216959

输出结果:

image-20200301152236095

5. fill()函数 的使用

fill()可以把数组或容器中的某一段区间赋为某个相同的值。和memset不同,这里的赋值可以是数组类型对应范围中的任意值。示例如下:

#include<iostream>
#include<algorithm>
#include<string>
using namespace std;

int main(){
    int a[10] = {1,2,3,4,5,6,7,8,9,10};
    string s = "abcdefg";
    //迭代器,容器空间
    fill(s.begin()+2,s.begin()+5,'h');
    //数组
    fill(a+1,a+5,0);
    
    cout<<s<<endl;
    //abhhhfg
    
    for(int i = 0; i < 10; i++){
        cout<<a[i]<<' ';
    }
    return 0;
}

注意:只能赋值是数组类型对应的范围中的任意值,不是数组类型,或者超过这个范围都不行

swap()函数

swap(a[0],a[1]);

交换a[0]和a[1]之间的值

参数是两个地址/引用

最大最小值

1.头文件

#include<climits>

2.使用

INT_MAX : int类型的最大值 —>无穷大

cout<<s<<endl;
//abhhhfg

for(int i = 0; i < 10; i++){
    cout<<a[i]<<' ';
}
return 0;

}


**注意:只能赋值是数组类型对应的范围中的任意值,不是数组类型,或者超过这个范围都不行**



**swap()函数**

` swap(a[0],a[1]);`

> 交换a[0]和a[1]之间的值
>
> 参数是两个地址/引用





**最大最小值**

1.头文件

**`   #include<climits> `**

2.使用

INT_MAX : int类型的最大值 —>无穷大

INT_MIN :  int类型的最小值—>无穷小
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值