c++stl库的基础学习-创新互联

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

创建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