STL容器

STL容器:

近容器顺序容器关联容器
stringvectorset
arr[ ]listmultiset
dequemap
multimap
容器适配器
stackdeque
queuedeque

模板打印函数:

template<typename CON>
void show_con(CON& con)
{
	typename CON::iterator it = con.begin();
	for (; it != con.end(); it++)
	{
		cout << *it << " ";
	}
	cout << endl;
}

1.近容器:

1.1string:这类容器中只能放入字符串,故称为近容器,arr[]也是如此。

1.1.1构造:
    string s;
    string s("abcdefg");//直接赋值构造;
	string s1(s);//拷贝构造
	string s2(s1.begin(),s1.end());//通过迭代器构造

1.1.2通过迭代器访问
(1)通过下标访问

for (int i = 0; i < 10; i++)
	{
		s.push_back('a'+i);//尾插
	}
	s.pop_back();//尾删

	for (int i = 0; i < s.size(); i++)
	{
		if (s[i] == 'b')
		{
			s[i] = 'y';
		}
		cout << s[i] << "  ";
	}

(2)通过迭代器访问(增删改查)

string::iterator it = s.begin();//迭代器
	for (; it != s.end(); it++)
	{
		if (*it == 'a')
		{
			//it = s.insert(it, 'm');//迭代器进行增删时要重新获取迭代器
			//cout << *it << "  ";
			///it++;//增加
			//it = s.erase(it);//删除
			*it='b';//改
		}

		cout << *it << "  ";//查
	}
	cout << endl;

1.1.3string容器里的方法

    s.back();//返回最后一个
	s.front();//返回第一个
	s.empty();//判空
	int sit = s.find("def");//查找。返回值是位置,有的容器里返回的是迭代器。
	//返回下标,没找到返回-1
	s.clear();//清空
	char err[10] = { "abcdefg" };//拷贝
	char* p = err;
	s.copy(p,4);//从对象拷贝到指针
	s.swap(s1);//交换两个容器的数据

2顺序容器:

2.1:vector 一维数组 按照1.5倍扩容

头文件:#include<vector

构造:

vector<int> v;
vector<int> v1(v);
vector<int> v2(v1.begin(),v1.end());

通过迭代器(增删改查)


	vector<int>::iterator it = v1.begin();
	for (; it != v1.end(); it++)
	{
		if (*it == 5)
		{
			//it = v1.insert(it, 999);
			//it++;
			//*it = 999;//增
			it = v1.erase(it);}
		cout << *it << " ";
	}

方法

    v.push_back(i);
	v.pop_back();
	 v.back();
	 v.front() ;
	v.size() ;//实际元数个数
	v.max_size();//容器最大容积
	v.swap(v1);//交换
	v.clear();
	v.empty();
	v.resize(10);
	v.reserve(10);
	copy(v1.begin(),v1.end(),ostream_iterator<int>(cout," "));//这个拷贝等于输出/打印

2.2:list 链表

头文件:#include<list

(1)构造:

list<int> L;
list<int> v1(v);
list<int> v2(v1.begin(),v1.end());

(2)方法:

	L.push_back(i);
	L.push_front(3);//list特有的头插
	L.pop_front();//list特有的头删
和vector大部分相同
	L.resize(20);
	L.reverse();

2.3:deque 双端队列 二维数组

头文件:#include<deque
空的 deque 容器在创建之后可以做添加或删除元素的操作.
当需要向序列两端频繁的添加或删除元素时,应首选 deque 容器。
起始位置起始位置在中间5处,有头指针和尾指针可以同时分别向前和向后,一般不常用。

3.关联容器

此类容器在存储元素值的同时,还会为各元素额外再配备一个值(又称为“键”,其本质也是一个 C++ 基础数据类型或自定义类型的元素),它的功能是在使用关联式容器的过程中,如果已知目标元素的键的值,则直接通过该键就可以找到目标元素,而无需再通过遍历整个容器的方式。

3.1:set 集合 数据有序 红黑树 不允许重复

set本质是一种集合,可以自动给数据排序(底层通过红黑树实现),不允许重复。
头文件:#include <set

插入

   set<int> s;
s.insert(23);//set的插入不同。
s.insert(34);
s.insert(78);
s.insert(67);
s.insert(56);
s.insert(56);
show_con(s);

在这里插入图片描述

查找:

set<int>::iterator it = s.find(12);//返回的是迭代器
if (it != s.end())
{
	cout << *it << endl;
}
else
{
	cout << "not find" << endl;
}

在这里插入图片描述

3.2:multiset 多重集合 数据有序 红黑树 允许重复

multiset只比set多出可重复功能。

multiset<int> s;
s.insert(23);
s.insert(34);
s.insert(78);
s.insert(67);
s.insert(56);
s.insert(56);
show_con(s);

在这里插入图片描述

3.3:map 映射表 数据按key有序 红黑树 不允许重复

头文件:#include<map

   map<int, string> mm;
mm.insert(make_pair(1, "aaa"));
mm.insert(make_pair(2, "bbb"));
mm.insert(make_pair(5, "eee"));
mm.insert(make_pair(3, "ccc"));
mm.insert(pair<int, string>(4, "ddd"));
map<int, string>::iterator it = mm.begin();
for (; it != mm.end(); it++)
{
	cout << it->first << "-->";map的输出first是第一个键
	cout << it->second << endl;map的输出second是第二个键
}
map<int, string>::iterator it1 = mm.find(2);//返回迭代器
if (it1 != mm.end())
{
	cout << it1->first << "-->";
	cout << it1->second << endl;
}
else
{
	cout << "not find" << endl;

}
cout << mm[4]<<endl;//这种输出方式存在风险

3.4multimap 多重映射表 数据按key有序 红黑树 允许重复

multimap<int, string> mmm;

mmm.insert(make_pair(1, "aaa"));
mmm.insert(make_pair(2, "bbb"));
mmm.insert(make_pair(5, "eee"));
mmm.insert(make_pair(3, "ccc"));

mmm.insert(make_pair(2, "fff"));
mmm.insert(make_pair(5, "ddd"));
mmm.insert(make_pair(3, "sss"));

multimap <int, string>::iterator it2 = mmm.begin();
for (; it2 != mmm.end(); it2++)
{
	cout << it2->first << "-->";
	cout << it2->second << endl;
}
	return 0;
}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值