1.STL(标准模板库)
STL是Standard Template Library的简称,中文名标准模板库,惠普实验室开发的一系列软件的统称。它是由Alexander Stepanov、Meng Lee和David R Musser在惠普实验室工作时所开发出来的。从根本上说,STL是一些“容器”的集合,这些“容器”有list,vector,set,map等,STL也是算法和其他一些组件的集合。这里的“容器”和算法的集合指的是世界上很多聪明人很多年的杰作。STL的目的是标准化组件,这样就不用重新开发,可以使用现成的组件。STL现在是C++的一部分,因此不用安装额外的库文件。
STL的版本很多,常见的有HP STL、PJ STL、 SGI STL等。
在C++标准中,STL被组织为下面的13个头文件:、、、、、、、<forward_list>、
2.容器
2.1
使用时要加入 头文件#include <vector>
#include <algorithm> // 使用泛型算法
#include <functional> // C++ STL的函数对象 greater less greater_equal less_
vector 容器
iterator 迭代器 容器的嵌套类 insert() erase()
allocator 空间配置器 如果用户自定义allocator
allocate deallocate construct destroy
class MyAllocator{}
vector<int, MyAllocator> vec;
容器的迭代器失效的问题?
连续 insert erase it != vec.end()
迭代器(用来遍历容器的)
正向迭代器
iterator begin(); vector *this
iterator end();
const_iterator begin()const;
const_iterator end()const;
反向迭代器
reverse_iterator rbegin();
reverse_iterator rend();
const_reverse_iterator rbegin()const;
const_reverse_iterator rend()const;
2.2容器分类
C++ STL 标准模板库
容器
2.2.1 顺序容器
[vector] :向量容器 内存可2倍扩容的数组 0 - 1 - 2 - 4 - 8
reserve / resize / size / empty
push_back/pop_back O(1)
insert/erase O(n)
[deque] : 双端队列 动态开辟的二维数组 MAP_SIZE QUEUE_SIZE
push_back/pop_back O(1)
push_front/pop_front O(1)
insert/erase O(n)
[list] : 链表容器 带头节点的双向链表
push_back/pop_back O(1)
push_front/pop_front O(1)
insert/erase O(1)
3.容器适配器
stack栈 => deque
stack s1;
stack<int, vector> s2;
s1.push(10); s1.pop(); s1.top(); s1.empty(); s1.size();
queue队列 => deque
queue q1;
queue<int, list> q3;
q1.push(10);
q1.pop();
q1.front();
q1.back();
q1.empty();
q1.size();
priority_queue优先级队列 => vector 大根堆 值越大,优先级越大
priority_queue maxHeap; 大根堆
maxHeap.push(10);
maxHeap.pop();
maxHeap.top();
maxHeap.empty();
maxHeap.size();
小根堆
priority_queue<int, vector, greater> minHeap;
关联容器(哈希表 红黑树)
4.迭代器
iterator
const_iterator
=> begin() end()
reverse_iterator
const_reverse_iterator
=> rbegin() rend()
5.泛型算法
泛型算法 template模板 + 容器的迭代器 + 函数对象(函数指针)
泛型算法
sort(it1, it2)
sort(it1, it2, 函数对象) lambda表达式
find
find_if
binary_search
*/
template<typename Container>
void showContainer(const Container &con)
{
// const int *p int *const p;
typename Container::const_iterator it = con.begin();
for (; it != con.end(); ++it)
{
cout << *it << " ";
}
cout << endl;
}
// 自己实现sort泛型算法
template<typename Iterator>
void mysort(Iterator first, Iterator last)
{
// 带两个参数的sort,默认是小到大进行排序的
typename Iterator::value_type tmp;
int size = last - first;
for (int i = 0; i < size - 1; ++i)
{
for (int j = 0; j < size - 1 - i; ++j)
{
if (*(first + j) > *(first + j + 1))
{
tmp = *(first + j);
*(first + j) = *(first + j + 1);
*(first + j + 1) = tmp;
}
}
}
}
// 定义指定排序的函数
template<typename T>
inline bool comp_greater(T a, T b)
{
return a > b;
}
template<typename T>
inline bool comp_less(T a, T b)
{
return a < b;
}
// 定义指定排序的函数对象
/*
函数对象:有operator()运算符重载的对象,一般使用在泛型算法当中,
改变泛型算法的行为,能够内联,节省函数的调用开销。
xx元函数对象:看operator()函数有几个形参
*/
template<typename T>
class MyGreater
{
public:
bool operator()(T a, T b)
{
return a > b;
}
};
template<typename T>
class MyLess
{
public:
bool operator()(T a, T b)
{
return a < b;
}
};
template<typename Iterator, typename Compare>
void mysort(Iterator first, Iterator last, Compare comp)
{
// void (*)(int, int) MyLess<int> comp
cout << typeid(Compare).name() << endl;
// 带三个参数的sort,可以自定义排序
typename Iterator::value_type tmp;
int size = last - first;
for (int i = 0; i < size - 1; ++i)
{
for (int j = 0; j < size - 1 - i; ++j)
{
/* 通过函数指针调用函数,无法内联,再简单的函数调用,
都会有正常的函数调用开销*/
/*
comp.operator()(*(first + j), *(first + j + 1))
*/
if (comp(*(first + j), *(first + j + 1)))
{
tmp = *(first + j);
*(first + j) = *(first + j + 1);
*(first + j + 1) = tmp;
}
}
}
}
int main()
{
vector<int> vec;
for (int i = 0; i < 20; ++i)
{
vec.push_back(rand() % 100 + 1);
}
showContainer(vec);
// 给vector默认排序
sort(vec.begin(), vec.end());
showContainer(vec);
//mysort(vec.begin(), vec.end(), comp_greater<int>);
sort(vec.begin(), vec.end(),
[](int a, int b)->bool {return a > b; });
showContainer(vec);
// 在容器中查找元素
auto it1 = find(vec.begin(), vec.end(), 59);
if (it1 == vec.end())
{
cout << "59 is not exist" << endl;
}
else
{
cout << "59 exist" << endl;
}
// 67这个数字按序插入到vec中
// bind1st:绑定第一个参数 bind2nd:绑定第二个参数
// greater a>b less a<b
// bind1st(greater<int>(), 67);
// bind2nd(less<int>(), 67);
/*
C++11支持的新标准
auto data = xxxxxx;
nullptr
foreach(迭代器)
lambda表达式:通过函数对象来实现
*/
it1 = find_if(vec.begin(), vec.end(),
//bind1st(greater<int>(), 67));
[](int a)->bool {return a < 67;});
vec.insert(it1, 67);
showContainer(vec);
int data = 100;
auto func = [&]()->void {data = 200; };
cout << typeid(func).name() << endl;
func();
cout << data << endl;
return 0;
}