4.C++数组等集合

4.1数组

数组创建注意事项:
  • 初始化的时候构造器{}里面的内容允许比容量少,其他没放置东西的地方默认值用0
    int a[10] = {21,25,3};
  • 初始化数组的时候如果没有构造器,则里面的值是未知的
    int a[10];
  • 定义空数组,里面内容均为0
    int a[10] = {};
  • 如果数组有构造器,且构造器中有数值的话,那么[]里的容量可以省略不写,默认创建数组数量相等的容量
    int a[] = { 2,5,6,13,58 };

字符数组

是一种特殊的数组,直接能输出字符串数组的所有东西
字符串数组的末尾一定要加一个结束的标点符号(结束符),assic=0 ‘\0’,结束符占一个位置
结束符号的存在原因:因为C或C++里所有的和字符相关的处理函数都是看结束符在哪来决定你的字符串是否完成

char a[10] = {'a','b','%',68,69,70,71,72,73,0};
char a[] = "helloworld";

4.2vector动态数组

会根据数组大小自动创建内存
因为数组底层扩容机制,为了效率高capcity会比size大,大20%

引入
#include <vector>
创建
vector<int> vec;
给数组填入数据的方法:从最后面填入
vec.push_back(23);
取中间数据的方法,如果越界会报错
vec.at(2) = 1000;
vec[2] = 1000;
数组元素清空的方法,因为要动内存会导致效率降低,cappcity不会改变
vec.clear();
查看size和capacity
cout << vec.size() << endl;
cout << vec.capacity() << endl;
判空方法
cout << vec.empty() << endl;
取最后一个值的方法
cout << vec.back() << endl;
取第一个值的方法
cout << vec.front() << endl;
c.begin() 
返回一个迭代器,它指向容器c的第一个元素
c.end() 
返回一个迭代器,它指向容器c的最后一个元素的下一个位置
c.rbegin() 
返回一个逆序迭代器,它指向容器c的最后一个元素
c.rend() 
返回一个逆序迭代器,它指向容器c的第一个元素前面的位置
迭代器:容器中带有begin end字样的函数均可给迭代器赋值
for (vector<int>::iterator p = vec.begin(); p != vec.end(); ++p) {
	cout << *p << endl;
}//不可以反向迭代
for (auto p = vec.begin(); p != vec.end(); ++p) {
	cout << *p << endl;
}//可以反向迭代
pop_back删除末尾一个值的方法
vec.pop_back();
erase可以删除迭代器位置的值,但是删除后迭代器会全部失效
vec.erase(vec.begin());
删了之后内存就没了,要重新获得迭代器vec.begin()
删除时会创建新的较小的内存然后让原来除了被删的数赋值给新内存

数组排序的方法
vec.sort() 
//升序排列
sort(vec.begin(),vec.end());
//降序排列
sort(vec.begin(),vec.end());

4.3list列表

引入
#include<list>
创建
list<int> L;
填入数据的方法
L.push_back(45);
L.push_front(45);
插入的方法
list<int>::iterator iter = L.begin();
iter++;
L.insert(iter,100);
pop_back删除值的方法
vec.pop_back();
vec.pop_front();
list用erase删除迭代器位置的值,迭代器是失效的,迭代器 = erase返回值
L.erase(iter);
remove根据值来删除,迭代器仍然是失效的
L.remove(45);
  • vector与list的区别
    补充:随机存取:就是看这玩意支持不支持[]直接访问或操作容器中某个位置的数据
    1.vector是数组 list是链表
    2.vector插入数据只有push_back,list有push_back和push_front,vector只有删除末尾,list开头末尾都可以删
    3.vector支持随机存取([]),list不支持随机存取
    4.vector具有capacity容量大小,list无需容量大小
    5.vector的迭代器能+ - += -= ++ --,但是list只有++和–
    6.如果容器的类型是简单数据类型(int float char double)或者是类结构体(结构体或者类中的成员不是特别复杂和多)的时候,vector操作速度比list要快,如果容器类型是复杂数据类型,list的操作速度比vector快

4.4stack栈

引入
#include<stack>
创建
stack<int> sta;
入栈
sta.push(23);
出栈
sta.pop();
访问最上面
sta.top();
访问长度
sta.size();
遍历栈
for (; !sta.empty();) {
	cout << sta.top() << endl;
	sta.pop();
}

4.5queue队列/堆

引入
#include<queue>
创建
queue<int> que;
入队
que.push(12);
出队(取出队列中的第一个;)
que.pop();
访问第一个
que.front();
访问最后一个,栈的top()和队的back是一个东西
que.back();
遍历队列
for (; !que.empty();) {
	cout << que.front() << endl;
	que.pop();
}

4.6deque双端队列

引入
#include<deque>
创建
deque<int> deq;
入队
deq.push_front(5);
deq.push_back(95);
可以查询中间的元素
deq.at(3) 
deq[3];
出队
deq.pop_back();
deq.pop_front();
遍历 rbegin和rend是逆向迭代器
for (auto p = deq.rbegin(); p != deq.rend(); ++p) {
	cout << *p << endl;
}

4.7map键值对

引入
#include<map>
创建
map<string, string> earthMap;
earthMap["挪威"]="北欧寒冷的国度";
earthMap["埃及"]="金字塔";
使用value_type插入新的数据,map的类型必须和value_type类型相符
earthMap.insert(map<string, string>::value_type("中国","可爱的大熊猫"));
另一个插入数据的方法
pair一对数据的意思,相当于map里保存的一对数据对象
earthMap.insert(pair<string,string>("韩国","辣白菜"));
erase能用迭代器删除,参数也能直接写keyname,会自动查找值并删除	
earthMap.erase("日本");
map的迭代器比较特殊,取值相当于获取pair,
里面的first就是keyname,second就是value
for (auto p = earthMap.begin(); p != earthMap.end(); ++p) {
	cout << p->first << endl;
}
foreach迭代map循环
for(pair<string,string> p : earthMap) {
	cout << p.first << endl;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值