打算自己记录一下c++的学习过程,例子中有很多是借鉴了网上视频和其他博主的博客
容器种类:vector, array, list,set, hash_set,, multi_set, map, hash_ map, multi_map list stack queue dequeue(双端队列)
priority_queue(优先级队列)
1,如何用机构体重载()的方式遍历数组
#include<algorithm>
#include<iostream>
using namespace std;
struct print
{
void operator()(int a)//结构体重载了()
{
cout << a << endl;
}
};
void main()
{
int a[] = { 3, 65, 6, 7, 3, 5, 78, 43 };
for_each(a, a + 5, print()); //第二个参数和第一个的差值决定输出元素的数量,第
//一个元素不一定是数组首地址
cin.get();
}
#include<algorithm>
#include<iostream>
#include<set>
using namespace std;
2,multiset迭代(multiset是允许有重复元素的set是不可以有重复元素的) 使用set必须引入include<set>
void main()
{
multiset<int> set;
set.insert(34);
set.insert(34);
set.insert(4565);
set.insert(23);
auto ib = set.begin();
auto ie = set.end();
for (; ib != ie; ib++)
{
cout << *ib << endl;
}
cin.get();
}
3.list用法(list中可以有重复元素,可以从头插入也可以在尾部插入,头文件需要引入include)
void main()
{
list<int> list;
list.push_back(45);
list.push_back(6);
list.push_back(76);
list.push_back(1);
list.push_back(45);//在尾部插入
list.push_front(34);//在头部插入
auto ib = list.begin();
auto ie = list.end();
for (; ib != ie; ib++)
{
cout << *ib << endl;
}
cin.get();
}
4,vector (需要引入include 下面的代码演示的是如何在vector中查找元素)
bool less2(int x)
{
return x < 78;
}
void main()
{
vector<int> v;
v.push_back(34);
v.push_back(23);
v.push_back(5);
v.push_back(67);
v.push_back(3);
auto ifind = find_if(v.begin(), v.end(), less2);//找到第一个满足less2函数中条件的元素
cout << *ifind << endl;
cin.get();
}
5,数组array和vector的区别(他们都是线性容器)
#include<iostream>
#include<vector>
#include<array>
using namespace std;
void main()
{
array<int, 4> arr = {3,4,5,6};//这是一个静态数组,数组的长度是不可变的,数组在栈上
vector<int> v;//这是一个动态数组,数组的长度是可变的,数组在堆上
v.push_back(34);//想数组上插入元素
cin.get();
}
注 : array适用于数组长度不需要变长,容量较小的场景
而vector适用于数组长度可变,容量较大的场景
6,list删除元素(list可以用erase删除元素也可以用remove删除元素)
void main()
{
list<int> l;
l.push_back(34);
l.push_back(4);
l.push_back(75);
l.push_back(3344);
l.push_back(56);
auto ib = l.begin();
ib++;
l.erase(ib);//删除元素
{
auto ibb = l.begin();
auto ie = l.end();
for (; ibb != ie; ibb++)
{
cout << *ibb << endl;
}
}
cin.get();
}
7,利用数组初始化list,根据值来删除list中元素
void main()
{
int a[] = { 2,35, 6, 678, 90, 434, 34 };
list<int> l(a, a + 4);//利用数组来初始化list,这里a是指定首地址 a+4指定尾部地址
l.remove(2);//根据元素的值来删除元素
auto ib = l.begin();
auto ie = l.end();
//l.remove(2);
for (; ib != ie; ib++)
{
cout << *ib << endl;
}
cin.get();
}
9,list数组的排序和合并
void main()
{
int a[5] = { 1, 2, 3, 104, 5 };
list<int > mylist1(a, a + 5);
int b[7] = { 11, 122, 33, 44, 55,4,553 };
list<int > mylist2(b, b + 5);
mylist1.sort();
mylist2.sort();//对数组进行排序排序
mylist1.merge(mylist2);//将两个数组合并,必须是排序后的数组才能合并,如果mylist2的数组长度大于mylist1那么多出的部分不会参与合并,重复的元素合并后只剩下一个
auto ib = mylist1.begin();
auto ie = mylist1.end();
for (; ib != ie; ib++)
{
cout << *ib << endl;
}
cin.get();
}
10,set和multiset被成为红黑树容器
void main()
{
set<int> s;
s.insert(34);
s.insert(3);
s.insert(564);
s.insert(6666);
auto sfind = s.find(3);//查找指定元素的指针
cout << *sfind << endl;
cin.get();
}
11,使用类模版打印数组元素,这种方法使用与所有的容器
template<class T>
class myprintlns
{
public:
void operator()(const T &t)
{
cout << t << endl;
}
};
void main()
{
vector<int> v;
v.push_back(435);
v.push_back(4);
v.push_back(435657);
v.push_back(45);
myprintlns<int> print;//实例化打印函数
auto ib = v.begin();
auto ie = v.end();
for_each(ib, ie, print);//迭代遍历打印list数组元素,这种方式适用于所有的容器
cin.get();
}
12,stack的使用方法
void main()
{
stack<int> s;
s.push(3);
s.push(345);
s.push(34);
while (!s.empty())
{
auto i = s.top();
cout << i << endl;
s.pop();
}
cin.get();
}
13,队列(queue这个是单向队列只能一边插入一遍拿出来)
void main()
{
queue<int> q;
q.push(34);
q.push(235);
q.push(2);
q.push(532);
while (!q.empty())
{
auto i = q.front();
cout << i << endl;
q.pop();
}
cin.get();
}
14,双端队列(双端队列的特点是可以在头部和尾部插入也可以指定在中间位置插入,使用双端队列必须include)
void main()
{
deque<int> d;
d.push_back(234);
d.push_back(34);
d.push_back(2314);
d.push_front(24323434);
d.insert(d.begin() + 3, 0);
for(int i = 0; i < d.size(); i++)//双端队列遍历方法1
{
cout << d[i] << endl;
}
cout << "/n/n/n/n/n/n/n/n/n/n" << endl;
auto ib = d.begin();
auto ie = d.end();
for (; ib != ie; ib++)//双端队列遍历方法2
{
cout << *ib << endl;
}
cin.get();
}
15,优先级队列priority_queue (优先级队列会自动给元素排序,所以下面的程序虽然元素的插入顺序不同,但是输出的时侯元素是从小到大排序的)
void main()
{
priority_queue<int> q;
q.push(34);
q.push(2334);
q.push(334);
q.push(234234);
while (!q.empty())
{
cout << q.top() << endl;
q.pop();
}
cin.get();
}
16,大部分时候我们在使用容器的时候里面都不是一个属性值,而是一个类或者结构体,如果里面是结构体的话需要下面的做法才能实现优先级队列
struct student
{
int age;
char *name;
};
struct stuless//用于排序的结构体
{
bool operator()(const student &s1, const student &s2)
{
return s1.age < s2.age;
}
};
void main()
{
priority_queue<student, deque<student>, stuless> p;//第一个参数代表机构体里面包含的数据结构,第二个是一个双端队列,
// 第三个是我们声明的结构体排序函数的指针,如果我们的对象是一个结构体的时候就必须是三个参数
student s1;
s1.age = 344;
s1.name = "hehe";
student s2;
s2.age = 45;
s2.name = "haha";
student s3;
s3.age = 34345;
s3.name = "heiheihei";
p.push(s1);
p.push(s2);
p.push(s3);
while (!p.empty())
{
cout << p.top().name << endl;
p.pop();
}
cin.get();
}
17,map的使用方法,map重载了[]所以可以用中括号进行取值和赋值,需要include
void main()
{
map<const char *, int> m;
m["hh"] = 5;
m["大气"] = 55;
m["上档次"] = 566;
m["h"] = 54;
cout << m["hh"] << endl;
cout << m["h"] << endl;
cout << m["大气"] << endl;
cout << m["上档次"] << endl;
cin.get();
}
18,hash_map的用法()插入和遍历,必须引入include,
采用pair的方式插入元素
void main()
{
hash_map<int, char*> hm;
hm.insert(pair<int, char *>(12,"sdf"));
hm.insert(pair<int, char *>(45, "fhgdsfg"));
hm.insert(pair<int, char *>(2, "sdfsdfsdfsdfsdf "));
hm.insert(pair<int, char *>(234, "fgsdfsdfsdfsdfsd"));
auto ib = hm.begin();
auto ie = hm.end();
for (; ib != ie; ib++)
{
cout << (*ib).first << " " << (*ib).second << endl;
}
cin.get();
}
19,hash_map查找某个元素的方法 find (这个函数返回的是一个指针,通过指针可以拿出元素的键和值) multimap的遍历方法和hash_map一样
void main()
{
hash_map<int, char*> hm;
hm.insert(pair<int, char *>(12, "sdf"));
hm.insert(pair<int, char *>(45, "fhgdsfg"));
hm.insert(pair<int, char *>(2, "sdfsdfsdfsdfsdf "));
hm.insert(pair<int, char *>(234, "fgsdfsdfsdfsdfsd"));
auto ib = hm.begin();
auto ie = hm.end();
for (; ib != ie; ib++)
{
cout << (*ib).first << " " << (*ib).second <<endl;
}
cout << "\n\n\n\n\n\n\n\n\n\n\n\n\n";
auto ifind = hm.find(2);//查找某个元素
if (ifind == hm.end())
{
cout << "嘿嘿,没找到" << endl;
}
else{
cout << (*ifind).first <<" "<< (*ifind).second<< endl;
}
cin.get();
}
20,hash_set 需要引入头文件include
void main()
{
hash_set h;
h.insert(34);
h.insert(344);
h.insert(234);
h.insert(322224);
h.insert(34);
auto ib = h.begin();
auto ie = h.end();
for (; ib != ie; ib++)
{
cout << *ib << endl;
}
cin.get();
}