泛型编程
c++的STL库体现了泛型编程的思想,面向对象编程关注的是编程的数据方面,而泛型编程关注的是算法。泛型编程旨在编写独立于数据类型的代码。
vector容器(数组)
重载了"[]"运算符,可对其中的元素随机访问。示例代码:
#include <vector>
#include <iostream>
using namespace std;
int main()
{
//可像使用数组一样
vector<int>b(3);//创建一个含有三个元素的vector容器
cout << b[0] << b[1]<<b.size();//s输出结果为003
//注意,若这样定义则为定义含三个vector<int>类型的数组
vector<int>c[3];//c[0],c[1],c[2]均为一个vector容器
//添加删除元素
vector<int> a{1,3,7,2,9,6,1};
a.push_back(7);//在末尾添加元素(常用)
a.pop_back();//移除最后一个元素(非访问)
//容量判断
a.empty();//判空
a.size();//返回元素数
//元素的访问
//可直接当数组使用(常用)
a[1];//3
a[2];//7
cout<<a.at(4);//访问指定的元素('4'为元素下标值),并进行越界检查
a.front();//访问第一个元素
a.back();//访问最后一个元素
//元素的遍历
//遍历方法1
for (auto x : a)
{
cout << x<<'\t';//打印所有元素值
}
//遍历方法2
for (int i = 0; i < a.size(); i++)
{
cout << a[i] << '\t';
//或者:
cout << a.at(i);
}
//遍历方法3
for (vector<int>::iterator i = a.begin(); i != a.end(); i++)
{
cout << *i<<'\t';
}
//若觉得麻烦vector<int>::iterator可用auto替换
return 0;
}
deque容器(双端队列)
重载了"[]"运算符,可对其中的元素随机访问。
#include <deque>
#include <iostream>
using namespace std;
int main()
{
deque<int> a{1,23,2,3,1};
//添加删除元素
a.push_front(2);//队首添加元素
a.emplace_front(3);
a.push_back(1);//队尾添加元素
a.emplace_back(1);
a.pop_back();//删除队尾元素(非访问元素)
a.pop_front();//删除队首元素
//容器的判空
a.empty();
a.size();
//元素的访问
a.at(1);//下标为1的元素
a[1];//下标为1的元素
a.front();//访问第一个元素
a.back();//访问最后一个元素
//元素的遍历
//遍历方法1
for (auto x : a)
{
cout << x << '\t';//打印所有元素值
}
//遍历方法2
for (int i = 0; i < a.size(); i++)
{
cout << a[i] << '\t';
//或者:
cout << a.at(i);
}
//遍历方法3
for (deque<int>::iterator i = a.begin(); i != a.end(); i++)
{
cout << *i<<'\t';
}
return 0;
}
list容器(双向链表)
未重载"[]"运算符,不可对其中的元素随机访问。
#include <list>
#include <iostream>
using namespace std;
int main()
{
list<int>a{ 22,2234,44 };
//添加删除元素
a.push_front(3);//队首添加元素
a.emplace_front(5);
a.push_back(12);//队尾添加元素
a.emplace_back(56);
a.pop_back();//删除队尾元素(非访问元素)
a.pop_front();//删除队首元素
//容器的判空
a.empty();
a.size();
//容器的操作
a.sort();//排序
list<int>b{ 9,9,2,1,2,3 };
b.sort();
a.merge(b);//对两个有序链表进行合并
//元素的访问
a.front();//访问第一个元素
a.back();//访问最后一个元素
//元素的遍历
//遍历方法1
for (auto x : a)
{
cout << x << '\t';//打印所有元素值
}
//遍历方法2
for (list<int>::iterator i = a.begin(); i != a.end(); i++)
{
cout << *i << '\t';
}
return 0;
}
queue适配器(双端队列)
未重载"[]"运算符,不可对其中的元素随机访问*不可对其中的元素随机访问,API文档中说道:“std::queue 类是容器适配器,它给予程序员队列的功能——尤其是 FIFO (先进先出)数据结构。”,
即把它当做真正的队列使用。
#include <queue>//队列
#include <iostream>
using namespace std;
int main()
{
//queue<int>a{ 9,9 };不允许这样初始化
queue<int> a;
//添加删除元素
a.push(2);
a.emplace(7);//入队
a.pop();//出队(返回值无)
//访问元素
a.front();//访问队首元素
a.back();//访问最后一个元素
//适配器判空
a.size();
a.empty();
//此容器不可遍历
return 0;
}
stack适配器(栈)
未重载"[]"运算符,不可对其中的元素随机访问*不可对其中的元素随机访问,API文档中写道:“std::stack 类是容器适配器,它给予程序员栈的功能——特别是 FILO (先进后出)数据结构。”,
即把它当做真正的栈使用。
#include<stack>
#include <iostream>
using namespace std;
int main()
{
//stack<int>a{ 1 };//不允许这样初始化
stack<int>a;
//添加删除元素
a.emplace(2);
a.push(2);//入栈
a.pop();//出栈(返回值无)
//元素的访问
a.top();//取栈顶元素
//适配器判空
a.size();
a.empty();
//无遍历操作
return 0;
}
set关联容器(红黑树)
相当于一个集合,可查找一个数是否在这个集合中,该容器中的元素的键和键值为同一个,自动排序,不允许相同元素。
#include<set>
#include <iostream>
using namespace std;
int main()
{
set<int>a{ 1,2,3,4,6,4 };
//添加删除元素
a.emplace();//添加元素
//无元素的访问
//查找(非常好用)
a.count(2);//返回匹配特定键的元素数量
a.find(2);//查找键为2的元素,若找到则返回2的迭代器。若找不到,则返回end()迭代器。
//a.contains(2);//与find()相似,不过返回值为true或false,c++20可用
a.lower_bound(2);//返回指向首个不小于给定键的元素的迭代器
a.upper_bound(2);//返回指向首个不大于给定键的元素的迭代器
//容量
a.size();
a.empty();
return 0;
}
map关联容器(红黑树)
重载了“[]”运算符,相当于一个集合,可查找一个数是否在这个集合中,每一个键对应一个键值,自动排序,不允许相同元素。注意第一个值为键,第二个位键值。
#include <map>
#include <iostream>
using namespace std;
int main()
{
map<int,int>a{ pair<int,int>(1,2),pair<int,int>(6,7)};
a[1] = 3;//相当于a.emplace(1,3);
//map作为关联式容器,每一个元素都含有键和相对应的键值,两者相关联
//插入删除元素
a.emplace(1, 1);
//a.insert();//需要用到迭代器
a.insert_or_assign(3, 4);
a.try_emplace(3, 5);//若键不存在则原位插入,若键存在则不做任何事
//元素访问
a.at(1);//查找键为1的元素,找到则返回键1对应的键值,否则返回空
a[1];//1为键,a[1]表示1对应的键值
//查找(非常好用)(注意,查找的都是查键)
a.count(2);//返回匹配特定键的元素数量
a.find(2);//查找键为2的元素,若找到则返回2的迭代器。若找不到,则返回end()迭代器。
//a.contains(2);//与find()相似,不过返回值为true或false,c++20可用
a.lower_bound(2);//返回指向首个不小于给定键的元素的迭代器
a.upper_bound(2);//返回指向首个不大于给定键的元素的迭代器
//容量
a.size();
a.empty();
return 0;
}
详细信息可访问c++STL滴API文档:C++API文档,里面有很详细的STL库中模板类的成员函数和模板类,我在这里仅给出了自己觉得方便的成员函数和类。