c++ stl库的基础学习

stl库学习

学了之后发现,太棒了,终于可以像python一样,不用那么麻烦了

这里面的东西其实都是可以类比到python那里面的
比如vector就是list,map就是dict,set就是会知道排序的集合,string就不多说了,pair就是小型的dict
就剩下了stack与queue以及bitset
前两者也是很好理解,queue就是排队一样,最大的特点是先进先出,而stack就像只有一口的羽毛球筒,后进先出,两者是相反的,而priority_queue则是会自动排序的queue
bitset不就是 bit set吗?使用进制的方式来表示set(因为是不会有重复的位置)下面有解释





所以剩下就只是了解其中的函数就可以了,不难捏(and 一些注意事项

vector

创建vector
两种
直接创建,为空

vector<int>abc;

创建还有值的

vector<int>abc={10,10};

添加
两种
类似append的

abc.push_back(11);

在指定位置插入的
(使用迭代器作为位置选择)

插入一个数

abc.insert(abc.begin(),1);

插入2个1

abc.insert(abc.begin(),2,1);

删除
删一个,取下标

abc.erase(abc.begin());

删多个,取切片

abc.erase(abc.begin(),abc.begin()+2);

排序
自己指定位置排序

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

倒置

reverse(v.begin(),v.end());

清空

v.clear();

判断是否为空

v.clear();

取值
类似于python,但是不能切片,只能够取一个

v[0]

长度

cout << abc.size();

遍历
1.用下标,不说了
2.用迭代器

for(it=vector.begin();it!=vector.end();it++){
		cout<<*it<<' ';
	} 

没啥说的

set

创建也是两种,不赘叙

set<int>abc={10,60};

添加元素
由于会自动排序,所以也就没必要有插入的位置

abc.insert(10);

删除
由于是不重复的,所以这个是删除指定的元素

abc.erase(10);

还有不少的函数就不多赘叙了

q.clear();		//清空q
q.empty();		//判断q是否为空,若是返回1,否则返回0
q.size();		//返回q中元素的个数
q.find(x);		//在q中查找x,返回x的迭代器,若x不存在,则返回指向q尾部的迭代器即 q.end()
然后就是寻找每个stl的end或是begin其实都是使用了迭代器的方式,所以也就没什么好说的了

string

把string提前,是因为这三个都是一类的可以使用迭代器的东西,并且用法都类似

创建
还是类似的两者
无自带的

string s;

自带的

string s2 =  "Hello"

添加
1.“+”

str += phrase;

但是注意

    string s2 =  "Hello" + s + "xxx"  + "xxx";
                   0     1      2         3
    相加必须是string类与“xxxx”类进行相加
    上面可以是因为01合并为了string,所以和2相加的时候没事
    后面是一样的
    s2 = "Hello" +  "xxx" + s; 
           0        1       2
    不行,因为01相加的时候,两者都不是string

2.append

s2.append("xxxx");+类似

3.insert

	// 插入
    // 下标
    s2.insert(0,2,'s'); 
    
    // 迭代器插入
    s2.insert(s2.begin(),'s');
    // 类似下标的方式
    s2.insert(s2.begin(),2,'s');
    // 表示插入两个

删除

string x1("value");
    string x2("value");
    string x3("value");
    string x4("value");

    x1.erase();//执行后,s1为空
    x2.erase(0,2); //执行后,s2为”lue”
    x3.erase(x3.begin());//执行后,s3为”alue”
    // 类似取下标的方式
    x4.erase(x4.begin(),++x4.begin());//执行后,s4为”alue”
    // 切片的方式,和python一样

replace
老熟人了,但是不一样,这是通过下标来删除,但是通过find可以达到python的效果

	string s2="xxxx";
// replace函数,就是insert与erase的结合体
    s2.replace(0,2,"aaa");
    // 输出 aaaxxx

find

	cout << s2.find("x") << endl;
    // 返回找到的第一个下标
    cout << s2.rfind("a");
    // 返回找到的最后一个的小标

map

老熟人了,类似字典

创建

map<string,int>haha;

添加
类python

haha["a"]=1;

比较常用的函数
因为容易理解

	haha.clear();     清空
	
	haha.count("a")   !!!这个只用于key/关键字,因为是惟一的,所以只要0/1

	 empty()         如果map为空则返回true

     erase()         删除一个 关键字+find()          查找一个关键字的迭代器(下面讲迭代器怎么用)

     insert()        插入 关键字+size()          返回map中元素的个数

重点,关于map迭代器怎么用捏

因为这里虽然有顺序(按加入的顺序作为迭代器的顺序)
但是怎么输出这个位置的关键字还是值捏?

	auto it = haha.begin();
    // frist结构/数组表示的是关键字
    // second的则是值
    // 因为哪怕你迭代了,也不知道要的是哪一个数据
    // 所以在使用迭代器之后要用frist指定是哪一位

    cout << it->first << endl; //输出的是关键字
    cout << it->second;// 输出的是值

pair

没什么好说的
就是单个map
创建

pair<string, string> anon;  

pair<string, string> author("James","Joy");

和map类似


pair<int ,double> p1;
 
p1.first = 1;
 
p1.second = 2.5;
 
cout<<p1.first<<' '<<p1.second<<endl;
 
//输出结果:1 2.5

没什么好说的
不过注意一点,就是两个pair之间的比较

	pair<int,string>a1(333,"a");
    pair<int,string>a2(666,"b");
    cout << (a1<a2) << endl;
    // 输出1,说明是TRUE,
    // 因为first当中333<666,所以就是1
	pair<int,string>a1(666,"a");
    pair<int,string>a2(666,"b");
    cout << (a1<a2) << endl;
    // 输出1,说明是TRUE,
    // 因为first一样,所以比较后面的,又因为b>a,所以1

queue

先进先出,无迭代器,所以每次只能看到一个元素
创建

queue<int>lala;

second

queue<int>lala({1,23,4});
也可这样子,顺序是1,23,4

常见函数

push() 在队尾插入一个元素
pop() 删除队列第一个元素
size() 返回队列中元素个数
empty() 如果队列空则返回true
front() 返回队列中的第一个元素
back() 返回队列中最后一个元素

因为不能够使用迭代器了
所以窥探容器只能使用front/back

也不能够使用clear了,所以只能


    while (!lala.empty())
    {
        lala.pop();
    }
    cout << lala.size();

priority_queue,其实就是堆,也有幸了解了堆的原理,就是那棵树

就是会排序的queue没啥好说的
创建

priority_queue<int>abc;

and以下的区别
默认是大顶堆

//升序队列,小顶堆
priority_queue <int, vector<int>, greater<int> > pq;
就是队伍最前的是最小的

//降序队列,大顶堆
priority_queue <int, vector<int>, less<int> > pq;
就是队伍最前的是最大的

其余的操作就和queue没什么区别呢捏

stack

这个也没什么好说的
就是后进先出,想象成一个羽毛球筒即可

创建

stack<int> s1();

second

stack<int> s1({1,23,4});
加入顺序就是1,23,4
所以最上面的是  4 

常见函数

size( ) :返回栈中元素个数
top( ) :返回栈顶的元素
pop( ) :从栈中取出并删除元素
push(e) :向栈中添加元素e
empty( ) :栈为空时返回true

bitset

非常简单的理解,给你一个数组{1,2,3,8,10}
如何快速地进行表示捏?
可以酱紫
1110000101
第几个位置为1就表示数组含有第几个数字,然后我们又知道位置只会有一个,而且表达方式也只有 有1/无0
所以很清楚的知道为什么是 bit set 了

创建
创建空的

bitset<10> foo;
0000000000

当然也可以导入东西
9的二进制的数值

bitset<5> foo(9);
01001

当然,如果二进制的数值超过了设置的,那么就会舍弃掉高位的数值

bitset<3> foo(9);
001
原本是01001

也可以是字符串,但必须全是0/1

bitset<4> foo(string("0101")); 
0101

几种常见的函数

foo3=foo&foo2   与,foo与foo2全是1,foo3才是1
foo|foo2   或,一个是就行
~foo		取反
foo^foo2	
foo<<=2		全部左移
foo>>=2		全部右移
foo.size() 返回长度(位数)
foo.count() 返回1的个数
foo.any() 返回是否有1,有则是1,无则是0
foo.none() 返回是否没有1,与上面相反
foo.set() 全都变成1


foo.set(p) 将第p + 1位变成1


foo.set(p, x) 将第p + 1位变成x
foo.reset() 全都变成0
foo.reset(p) 将第p + 1位变成0
foo.flip() 全都取反
foo.flip(p) 将第p + 1位取反
————————————————

原文链接:https://blog.csdn.net/ywh15387127537/article/details/88707044

特别注意
foo.set§ 将第p + 1位变成1

bit的位置是从右向左的!!!

	bitset<4> foo(9);
	1 0 0 1
	a b c d
    foo.set(1);
    从右向左的第一位,取的是下标
    所以应该是c的位置
    
    cout << foo;
    1011

test()
这个位置是否是1,是则返回1

	bitset<4> foo(9);
	1 0 0 1
    cout << foo.test(0);
    返回1
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值