C++ STL 体系结构与内核分析 P1-P6(set map multiset multimap unordered_multiset)

C++ STL 体系结构与内核分析 P1P2 STL体系结构基础介绍

STL体系基础介绍

六大部件:
1.容器(contain):容纳数据
2.分配器(allocator):给容器分配内存空间
3.算法(algorithm):处理容器的数据
4.迭代器(iterator):算法和容器的桥梁,相当于泛化的指针
5.适配器(adapters):转换作用
6.函数对象(functors)(仿函数):
在这里插入图片描述
容器空间为前闭后开,在程序中表现为迭代器不需要到c.end()

Containner<T>::iterator ite = c.begin();
for(;ite !=c.end();++ite)//ite为迭代器,相当于泛化的指针
{....}

C++11新特性:range-based for statement,可使用for生成 迭代器遍历容器

for(int i :{2,3,5,7,9,13,17,19}){
	std::out<<i<<std::endl;
}

std::vector<double>vec;
...
for(auto elem:vec){
	std::cout<<elem<<std::endl;
}
for(auto& elem:vec){//使用引用来改变容器元素值
	elem*=3;
}

Vector测试代码

Vector测试代码
完整代码在GIthubSTL_Vector

void test_vector(long& value)
{
	cout << "\ntest_vector()..............\n";
	vector<string> c;
	char buf[10];

	clock_t timeStart = clock();
	for (long i = 0; i < value; i++)
	{
		try {
			snprintf(buf, 10, "%d", rand());
			c.push_back(string(buf));
		}
		catch (exception& p) {
			cout << "i=" << i << "" << p.what() << endl;
			abort();
		}
	}
	cout << "milli-seconds:" << (clock() - timeStart) << endl;
	cout << "vector_size:" << c.size() << endl;
	cout << "vector_front:" << c.front() << endl;
	cout << "vector_size:" << c.size() << endl;
	cout << "vector_data:" << c.data() << endl;
	cout << "vector_capacity:" << c.capacity() << endl;



	string	target=get_a_target_string();
	{
		timeStart = clock();
		auto pItem = ::find(c.begin(), c.end(), target);//find返回interator
		cout << "find(),milli-seconds:" << (clock() - timeStart) << endl;
		if (pItem != c.end())
			cout << "find() found" << *pItem << endl;
		else
			cout << "find() not found" << endl;
	}
	{
		timeStart = clock();
		sort(c.begin(), c.end());
		string * pItem = (string*)bsearch(&target, (c.data()), c.size(), sizeof(string), comparestrings);
		cout << "sort()+bserch():,milli-seconds:" << clock() - timeStart << endl;
		if (pItem != NULL)
			cout << "bsearch found" << endl;
		else
			cout << "bsearch not found" << endl;

	}
	while (1);
}

常用的容器

deque(双向队列)
特点:两端开口,分段连续
在这里插入图片描述
stack(栈)(由deque构建)
在这里插入图片描述
queue队列(由deque构建)
在这里插入图片描述
multiset:基于红黑树,key=value,关联性容器,自带的find()基于key访问速度非常快
multimap:基于红黑树,包括key和value,不可以用 []做insertion,调用insert时需要自行用pair()将key和value组合在一起,自带的find()基于key访问速度非常快
unordered_multiset:基于hash表,桶的个数大于需要存储的元素个数,若元素个数超过桶的个数,则桶个数需要×2
unordered_multimap:基于hash表,关联式容器适合大量数据且需要搜寻
set:key不可以重复
map:低层是红黑树,放进去的元素key不可以重复value可以重复,可以使用[]做insert
unordered_set:基于hash表
unordered_map:基于hash表

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值