IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 系统运维 -> STL容器 -> 正文阅读

[系统运维]STL容器

STL容器

近容器

1、int arr[ ]
2、string
下面的程序只是对string这个容器内部一些函数的使用作以举例,全部运行并没有意义。

#include <iostream>
#include <string>
using namespace std;
int main()
{
	string s("abcdefg");
	string s1(s);//拷贝构造

	string s2(s1.begin(), s1.end());//通过迭代器,让s1的开始到最后结束这个区间来构造s2
	cout << s2 << endl;

	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] << " ";
	}
	cout << endl;

	cout << typeid(s.c_str()).name() << endl;//输出s类型的名字
	//c_str()就是将C++的string转化为C的字符串数组,c_str()生成一个const char*指针,指向字符串的首地址
	
	//string容器还重载了
	//cin>>s;
	//cout<<s<<endl;

	//string 迭代器的使用
	string::iterator it = s.begin();
	for (; it != s.end(); it++)
	{
		if (*it == 'a')
		{
			/*
			//插入:①要用迭代器接收返回值②it++,否则就会进入死循环
			it = s.insert(it, 'm');
			cout << *it << " ";
			it++;
			*/

		    //删除
			it = s.erase(it);
		}
		cout << *it << " ";
	}
	cout << endl;

	s.begin();
	s.front();
	s.empty();
	int pos = s.find("def");//成功则返回第一个查找到的下标,否则返回-1
	cout << pos << endl;

	//s.clear();清除
	char err[10] = { "abcdefg" };
	char* p = err;
	s.copy(p, 3);//将s这个string对象的前3个元素拷贝给p锁指向的数组
	cout << s << endl;
	cout << err << endl;

	//扩容
	s.reserve();
	s.resize(20);

	//交换两个容器的数据
	s.swap(s1);

顺序容器

1、vertor 一维数组 按照1.5倍扩容

#include <vector>;
//通过模板的形式将对象的相关内容输出
template<typename CON>
void Show(CON& con)
{
	typename CON::iterator it = con.begin();
	for (; it != con.end(); it++)
	{
		cout << *it << " ";
	}
	cout << endl;
}
//vector 容器
int main()
{
	vector<int> v;
	vector<int>v1;
	for (int i = 0; i < 10; i++)
	{
		v.push_back(1 + i);//尾插
	}
	v.pop_back();//尾删

	cout << v.back() << endl;
	cout << v.front() << endl;
	cout << v.size()<< endl;//v.size()指的是有效元素个数
	cout << v.max_size() << endl;//v.max_size()指的是在这个容器最大可以存储的元素
	v.swap(v1);//将v和v1中的元素进行交换
	v.clear();
	v.empty();
	v.resize(10);
	v.reserve(10);

	for (int i = 0; i < v1.size(); i++)
	{
		cout << v1[i] << " ";
	}
	cout << endl;
	//vector 通过迭代器进行增删改查
	vector<int>::iterator it = v1.begin();
	for (; it != v1.end(); it++)
	{
		if (*it == 5)
		{
			/*
		    //增加
		    it = v1.insert(it, 999);
		    it++;
		    */

			/*
		    //删除
			it = v1.erase(it);
			*/

			/*
			//改
			*it=999;
			*/
		}
		cout << *it << " ";
	}
	cout << endl;
	//通过模板的方式来输出
	Show(v1);

	string s1("abcdefg");
	Show(s1);//定义的输出模板也可以将string容器的对象进行输出

	//copy是一个泛型算法(也就是模板),ostream_iterator是一个输出流的迭代器
	copy(v1.begin(),v1.end(), ostream_iterator<int>(cout," "));
}

容器可以通过迭代器进行构造:

int main()
{
	list<int>L;
	for (int i = 0; i < 10; i++)
	{
		L.push_back(i+1);
	}
	//v1是空的,如何让v1里面的数据和L里面的数据保持一致?
	//也就是如何用链表去初始化vector?
	vector<int>v1(L.begin(), L.end());//容器可以通过迭代器进行构造
	Show(v1);
	return 0;
}

2、list 链表

//list容器
#include <list>
int main()
{
	list<int>L;
	for (int i = 0; i < 10; i++)
	{
		L.push_back(i);//尾插
	}
	L.pop_back();//尾删
	Show(L);

	vector<int>v1;
	//v1是空的,如何让v1里面的数据和L里面的数据保持一致?
	//也就是如何用链表去初始化vector?
	vector<int>v1(L.begin(), L.end());//容器可以通过迭代器进行构造
	Show(v1);

	L.push_front(3);
	L.pop_front();

	L.resize(20);
	L.reverse();
}

3、deque 通过双端队列实现的二维数组

容器适配器

1、stack ——— deque

#include <stack>
int main()
{
	stack<int> s;
	for (int i = 0; i < 10; i++)
	{
		s.push(i);
	}
	s.pop();
	s.top();
	s.empty();
	s.size();

	return 0;
}

2、queue ——— deque

#include <queue>;
int main()
{
     queue<int> q;
	for (int i = 0; i < 10; i++)
	{
		q.push(i);
	}
	q.pop();
	q.front();
	q.size();
	q.empty();
}

关联容器

1、set 是一个集合,集合内部的数据是有序排列,底层是用红黑树实现,set集合不允许数据重复

#include <set>;
int main()
{
	set<int> s;
	s.insert(56);
	s.insert(12);
	s.insert(39);
	s.insert(6);
	s.insert(999);
	s.insert(25);
	Show(s);

	set<int>::iterator it = s.find(99);
	if (it != s.end())
	{
		cout << *it << endl;
	}
	else
	{
		cout << "don`t find" << endl;
	}

	//s.clear();
	cout << s.count(78) << endl;//数一数78出现了几次,肯定是一次
	s.empty();
	s.size();
	//s.swap();
}

例题:
假如下面不同的数字代表不同类型的糖果,小明有这样一盒糖,但是他一天只能吃这些糖果的一半,问:小明最多能吃到多少类型的糖果?
2 3 3 4 3 4 2 3 2
传入的参数是:vector v
只有两种比较的可能:
①如果总的长度为n,一半就是n/2
②type(糖果总的类型)
比较type 和n/2
如果type大,能吃到最多的种类就是n/2
如果n/2大,能吃到最多的种类就是type
如何找type——将其放进set里面去
return min(set(v.begin(),v.end()).size(),v.size/2)

2、multiset 多重集合,与set的区别在于允许数据重复

#include <set>;
int main()
{
    multiset<int> ms;
	ms.insert(56);
	ms.insert(98);
	ms.insert(34);
	ms.insert(21);
	ms.insert(158);
	ms.insert(999);
	ms.insert(5);
	ms.insert(84);
	ms.insert(84);
	ms.insert(84);
	Show(ms);
	multiset<int>::iterator it = ms.find(84);
	if (it != ms.end())
	{
		for (int i = 0; i < ms.count(87); i++)
		{
			cout << *it << endl;
			it++;
		}
	}
	else
	{
		cout << "don`t find" << endl;
	}
}

3、map 是一个映射表,数据按key有序,底层也是通过红黑树实现,不允许出现重复映射

#include <map>;
int main()
{
    map<int,string>mm;
	mm.insert(make_pair(1, "qqqq"));
	mm.insert(make_pair(2, "wwww"));
	mm.insert(make_pair(4, "aaaaa"));
	mm.insert(make_pair(3, "abcde"));
	mm.insert(pair<int,string>(5, "ddd"));

	map<int, string>::iterator it = mm.begin();
	for (; it != mm.end(); it++)
	{
		cout <<it-> first << "---->";
		cout << it->second << endl;
	}

	map<int, string>::iterator it = mm.find(5);
	if (it != mm.end())
	{
		cout << it->first << "---->";
		cout << it->second << endl;
	}
	mm.empty();
	//mm.clear();
	//mm.swap();
	mm.erase(5);
	mm.count(5);
	return 0;
}

4、multimap 多重映射表,与map的区别在于允许重复

#include <map>;
int main()
{
	map<int,string>mm;
	mm.insert(make_pair(1, "qqqq"));
	mm.insert(make_pair(2, "wwww"));
	mm.insert(make_pair(4, "aaaaa"));
	mm.insert(make_pair(3, "abcde"));
	mm.insert(pair<int,string>(5, "ddd"));

	map<int, string>::iterator it = mm.begin();
	for (; it != mm.end(); it++)
	{
		cout <<it-> first << "---->";
		cout << it->second << endl;
	}

	map<int, string>::iterator it = mm.find(5);
	if (it != mm.end())
	{
		cout << it->first << "---->";
		cout << it->second << endl;
	}
	mm.empty();
	//mm.clear();
	//mm.swap();
	mm.erase(5);
	mm.count(5);


	multimap<int, string>mmm(mm.begin(),mm.end());
	mmm.insert(make_pair(1, "qqqq"));
	mmm.insert(make_pair(2, "wwww"));
	mmm.insert(make_pair(4, "aaaaa"));
	mmm.insert(make_pair(3, "abcde"));
	multimap<int, string>::iterator it2 = mmm.begin();
	for (; it != mmm.end(); it++)
	{
		cout << it2->first << "--->";
		cout << it2->second << endl;
	}
	return 0;
}
  系统运维 最新文章
配置小型公司网络WLAN基本业务(AC通过三层
如何在交付运维过程中建立风险底线意识,提
快速传输大文件,怎么通过网络传大文件给对
从游戏服务端角度分析移动同步(状态同步)
MySQL使用MyCat实现分库分表
如何用DWDM射频光纤技术实现200公里外的站点
国内顺畅下载k8s.gcr.io的镜像
自动化测试appium
ctfshow ssrf
Linux操作系统学习之实用指令(Centos7/8均
上一篇文章      下一篇文章      查看所有文章
加:2021-11-20 18:49:01  更:2021-11-20 18:51:19 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/16 0:45:50-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码