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”类进行相加
上面可以是因为0与1合并为了string,所以和2相加的时候没事
后面是一样的
s2 = "Hello" + "xxx" + s;
0 1 2
不行,因为0与1相加的时候,两者都不是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