c++stl库的基础学习-创新互联
学了之后发现,太棒了,终于可以像python一样,不用那么麻烦了
成都创新互联是一家专注于成都网站设计、做网站、成都外贸网站建设公司与策划设计,岭东网站建设哪家好?成都创新互联做网站,专注于网站建设十年,网设计领域的专业建站公司;建站业务涵盖:岭东等地区。岭东做网站价格咨询:13518219792这里面的东西其实都是可以类比到python那里面的 比如vector就是list,map就是dict,set就是会知道排序的集合,string就不多说了,pair就是小型的dict 就剩下了stack与queue以及bitset 前两者也是很好理解,queue就是排队一样,大的特点是先进先出,而stack就像只有一口的羽毛球筒,后进先出,两者是相反的,而priority_queue则是会自动排序的queue bitset不就是 bit set吗?使用进制的方式来表示set(因为是不会有重复的位置)下面有解释所以剩下就只是了解其中的函数就可以了,不难捏(and 一些注意事项这里写目录标题
- stl库学习
- 这里面的东西其实都是可以类比到python那里面的
- 比如vector就是list,map就是dict,set就是会知道排序的集合,string就不多说了,pair就是小型的dict
- 就剩下了stack与queue以及bitset
- 前两者也是很好理解,queue就是排队一样,大的特点是先进先出,而stack就像只有一口的羽毛球筒,后进先出,两者是相反的,而priority_queue则是会自动排序的queue
- bitset不就是 bit set吗?使用进制的方式来表示set(因为是不会有重复的位置)下面有解释
- 所以剩下就只是了解其中的函数就可以了,不难捏(and 一些注意事项
- vector
- set
- 然后就是寻找每个stl的end或是begin其实都是使用了迭代器的方式,所以也就没什么好说的了
- string
- 把string提前,是因为这三个都是一类的可以使用迭代器的东西,并且用法都类似
- map
- pair
- queue
- priority_queue,其实就是堆,也有幸了解了堆的原理,就是那棵树
- stack
- bitset
创建vector
两种
直接创建,为空
vectorabc;
创建还有值的
vectorabc={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创建也是两种,不赘叙
setabc={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老熟人了,类似字典
创建
maphaha;
添加
类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
创建
pairanon;
pairauthor("James","Joy");
和map类似
pairp1;
p1.first = 1;
p1.second = 2.5;
cout<
没什么好说的
不过注意一点,就是两个pair之间的比较
paira1(333,"a");
paira2(666,"b");
cout<< (a1a1(666,"a");
paira2(666,"b");
cout<< (a1a,所以1
queue先进先出,无迭代器,所以每次只能看到一个元素
创建
queuelala;
second
queuelala({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_queueabc;
and以下的区别
默认是大顶堆
//升序队列,小顶堆
priority_queue, greater>pq;
就是队伍最前的是最小的
//降序队列,大顶堆
priority_queue, less>pq;
就是队伍最前的是大的
其余的操作就和queue没什么区别呢捏
stack这个也没什么好说的
就是后进先出,想象成一个羽毛球筒即可
创建
stacks1();
second
stacks1({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
你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧
网站名称:c++stl库的基础学习-创新互联
当前网址:http://hbruida.cn/article/jpojp.html