C++05容器(一),容器适配器,,泛型算法,迭代器

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>、、<unordered_map>、、、、、<unordered_set>、和。

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();

扫描二维码关注公众号,回复: 5956767 查看本文章

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;
}

猜你喜欢

转载自blog.csdn.net/sunshinecandy/article/details/89279787