STL-常用容器

一、string容器

(一)string本质:

  • string是c++风格的字符串,而string本质上是一个类

string 和 char * 的区别:

  • char * 是一个指针
  • string是一个类,类内部封装的char*,管理这个字符串,是一个char*容器。

特点:

  • string类内部封装了很多成员方法(例如:查找 find ,拷贝 copy ,删除 delete 替换 replace, 插入 insert)
  • string管理char*所分配的内存,不用担心复制越界和取值越界等,由类内部进行负责

(二)string构造函数

构造函数原型:

  • string();   //创建一个空的字符串 例如:string str;
  • string(const char* s) //使用字符串s初始化
  • string(const string& str);//使用一个string对象初始化另一个string对象
  • string(int n,char c); //使用n个字符c初始化
#include <iostream>
using namespace std;
//string 构造函数
//string();   //创建一个空的字符串 例如:string str;
//string(const char* s) //使用字符串s初始化
//string(const string& str);//使用一个string对象初始化另一个string对象
//string(int n,char c); //使用n个字符c初始化
void test01() {
	
	string s1;//默认构造
	const char* str = "hello world";
	string s2(str);//使用字符串初始化
	cout <<"s2="<<s2<<endl;
	string s3(s2);//使用string对象初始化 拷贝构造
	cout << s3 << endl;
	string s4(10, 'a');//使用10个字符'a'初始化
	cout << s4 << endl;

}

int main() {
	test01();



	system("pause");
	return 0;
}

(三)string 赋值操作

功能描述:

  • 给string字符串进行赋值

赋值函数原型:

  • string& operator = (const char* s); //char* 类型字符串,赋值给当前字符串
  • string& operator = (const string &s);//把字符串s赋值给当前的字符串
  • string& operator =(char c);//把字符串赋值给当前字符串
  • string& assign =(const char *s); //字符串s赋值给当前的字符串
  • string& assign(const char *s,int n );//把字符串s的前n个字符赋值给当前的字符串
  • string& assign(const string &s);//把字符串s赋值给当前字符串
  • string& assign(int n,char c); //把n个字符c赋值给当前字符串
#include <iostream>
using namespace std;
/*
string 的赋值操作
string& operator = (const char* s); //char* 类型字符串,赋值给当前字符串
string& operator = (const string &s);//把字符串s赋值给当前的字符串
string& operator =(char c);//把字符串赋值给当前字符串
string& assign =(const char *s); //字符串s赋值给当前的字符串
string& assign(const char *s,int n );//把字符串s的前n个字符赋值给当前的字符串
string& assign(const string &s);//把字符串s赋值给当前字符串
string& assign(int n,char c); //把n个字符c赋值给当前字符串

*/


void test02() {
	string str1;
	str1 = "hello world"; //string& operator = (const char* s)
	cout << "str1 =" << str1 << endl;

	string str2;
	str2 = str1;//string& operator = (const string &s);
	cout << "str2=" << str2 << endl;

	string str3;
	str3 = 'a'; //string& operator =(char c);
	cout << "str3=" << str3 << endl;

	string str4;
	str4.assign("hello C++"); //string& assign =(const char *s);
	cout << "str4=" << str4 << endl;

	string str5;
	str5.assign("hello C++", 5);
	cout << "str5=" << str5 << endl;//string& assign(const char *s,int n );

	string str6;
	str6.assign(str5);
	cout << "str6=" << str6 << endl; //string& assign(const string &s);

	string str7;
	str7.assign(5, 'a'); //string& assign(int n,char c);
	cout << "str7=" << str7 << endl;

}
int main() {
	test02();


	system("pause");
	return 0;
}

(四)string 字符串拼接

功能描述:

  • 实现在字符串末尾拼接字符串

函数原型:

  • string& operator +=(const char* str); //重载+=操作符
  • string& operator +=(const char   c ); //重载+=操作符
  • string& operator +=(const string& str); //重载+=操作符
  • string& append(const char *s);//把字符串s连接到当前字符串结尾
  • string& append(const char *s,int n);//把字符串s的前n个字符链接到当前字符串结尾
  • string& append(const string &s);//同operator += (const string& str)
  • string& append(const string &s,int pos ,int n);//字符串s中从pos开始的n个字符链接到字符串结尾
#include <iostream>
using namespace std;
//string字符串拼接
/*
字符串拼接
string& operator +=(const char* str); //重载+=操作符
string& operator +=(const char   c ); //重载+=操作符
string& operator +=(const string& str); //重载+=操作符
string& append(const char *s);//把字符串s连接到当前字符串结尾
string& append(const char *s,int n);//把字符串s的前n个字符链接到当前字符串结尾
string& append(const string &s);//同operator += (const string& str)
string& append(const string &s,int pos ,int n);//字符串s中从pos开始的n个字符链接到
*/

void test03() {
	string str1 = "我";
	str1 += "爱玩游戏";
	cout<<"str1=" << str1 << endl; //string& operator +=(const char* str);
	str1 += ':';
	cout << "str1=" << str1 << endl;//string& operator +=(const char   c );
	string	str2 = "LOL DNF CF";
	str1 += str2; //string& operator +=(const string& str);
	cout << "str1=" << str1 << endl;
	
	string str3 = "I";
	str3.append(" love"); //string& append(const char *s);
	cout << "str3=" << str3 << endl;
	str3.append("game abcde", 4);
	cout << "str3=" << str3 << endl; //string& append(const char *s,int n);
	//str3.append(str2); //string& append(const string &s);
	//cout << "str3=" << str3 << endl;
	str3.append(str2, 0, 3);
	cout << "str3=" << str3 << endl; //string& append(const string &s,int pos ,int n);


}


int main() {
	test03();
	system("pause");
	return 0;
}

(五)string查找和替换

功能描述:

  • 查找:查找指定字符串是否存在
  • 替换:在指定位置替换字符串

函数原型:

  • int find (const string& str,int pos = 0)const;//查找str第一次出现位置,从pos开始查找
  • int find (const char *s,int pos=0)const;//查找s第一次出现位置,从pos开始查找
  • int find (const char *s,int pos ,int n)const;//从pos位置查找s的前n个字符串第一次位置
  • int find (const char c,int pos =0)const;//查找字符c第一次出现的位置
  • int rfind(const string& str,int pos =npos)const ;//查找str最后一次位置,从pos开始查找
  • int rfind(const char* s,int pos =npos)const ; //查找str最后一次位置,从pos开始查找
  • int rfind(const char* s,int pos,int n)const;//从pos查找s的前n个字符最后一次位置
  • int rfind (const char c ,int pos =0)const;//查找字符c最后一次出现的位置
  • string & replace(int pos,int n,const string& str);//替换从pos开始n个字符为字符串str
  • string & replace(int pos,int n,const char *s);//替换从pos开始的n个字符为字符串s
#include <iostream>
using namespace std;
//字符串查找和替换

//1.查找
void testFind() {

	string str1 = "abcdefgde";
	int pos = 	str1.find("de");//没有返回 -1
	if (pos == -1) {
		cout << "未找到字符串" << endl;
	}
	else {


		cout << "pos=" << pos << endl;
	}

	//rfind 和 find rfind 从右往左查  从左往右查
	pos = str1.rfind("de");
	cout << "pos=" << pos << endl;
}



//2.替换
void testReplace() {

	string str1 = "abcdefg";
	str1.replace(1, 3, "1111");//从1号位置起 3个字符替换成1111
	cout << str1 << endl;

}
int main() {
	testFind();
	testReplace();

	system("pause");
	return 0;
}

总结:

  • find查找是从左往右,rfind从右往左
  • find找到字符串后返回查找的第一个字符的位置,找不到返回-1
  • replace在替换时,要指定从哪个位置起,多少个字符,替换成什么样的字符串

(六)字符串比较

功能描述:

  • 字符串之间的比较

比较方式:

  • 字符串比较是按字符的ASCII码进行对比

= 返回 0

> 返回 1

< 返回 -1

函数原型

  • int compare(const string &s)const; //与字符串s比较
  • int compare(const char *s)const;//与字符串s比较
#include <iostream>
using namespace std;
//字符串比较

void testCompare() {

	string str1 = "xello";
	string str2 = "zello";

	if (str1.compare(str2) == 0) {

		cout << "str1 等于 str2" << endl;
	}
	else if (str1.compare(str2) > 0) {
		cout << "str1 大于 str2" << endl;
	
	}
	else {
		cout << "str1 小于 str2" << endl;
	}
}



int main() {
	testCompare();

	system("pause");
	return 0;
}

(七)string 字符存取

string中单个字符串存取方式有两种

  • char & operator [ ](int n);//通过[ ]方式取字符
  • char& at(int n);//通过at方法获取字符
#include <iostream>
using namespace std;
//string 字符存取

void testAt() {
	string str = "hello";
	//1.通过[下标]访问单个字符
	for (int i = 0; i < str.size(); i++) {
		cout << "str["<<i<<"] = " << str[i] << endl; // 输出 h


	}
	cout << "*************************" << endl;
	//2.通过at方法访问单个字符
	for (int i = 0; i < str.size(); i++) {
		cout << "str[" << i << "] = " << str.at(i) << endl; // 输出 h


	}
 //修改单个字符
	str[0] = 'x';
	cout << "str = " << str << endl; // 输出 xello
	str.at(1) = 'x';
	cout << "str = " << str << endl; // 输出 xxllo
}




int main() {

	testAt();
	system("pause");
	return 0;



}

(八)string插入和删除

功能描述:

  • 对string字符串进行插入和删除字符操作

函数原型:

  • string& insert(int pos,const char *s);  //插入字符串
  • string& insert (int pos,const string& str);//插入字符串
  • string& insert (int pos,int n,char c);在指定位置插入n个字符c
  • string& erase (int pos,int n =npos) //删除从pos开始的n个字符
#include <iostream>
using namespace std;
//字符串的插入和删除
void testInsert() {
	string str = "hello";

	//插入
	str.insert(1, "111");
	cout << str << endl;

	//删除
	str.erase(1,3);
	cout << str << endl;

}

int main() {
	testInsert();
	system("pause");
	return 0;
}

(九)string子串

功能描述:

  • 从字符串中获取想要的子串

函数原型:

  • string substr(int pos =0,int n =npos)const ;//返回由pos开始的n个字符组成的字符串
#include <iostream>
using namespace std;
//子串

void testSubString() {
	string str = "abcdef";

	string Substr = str.substr(1, 3);
	cout << Substr << endl; //bcd

}
//使用操作
void testSubString02() {
	string str = "zhangsan@sina.com";
	//从邮件的地址中获取用户名的信息
	int pos = str.find("@");
	string username = str.substr(0, pos);
	cout << "用户名:" << username << endl;
}


int main() {
	testSubString();
	testSubString02();
	system("pause");
	return 0;
}

二、vector 容器

(一)vector基本概念

功能:

  • vector 数据结构和数组非常相似,也称为单端数组

vector与普通数组的区别:

  • 不同之处在于数组是静态空间,而vector可以动态扩展

动态扩展:

  • 并不是在源空间之后续接新空间,而是找更大的内存空间,然后将原数据拷贝新空间,释放原空间

  • vector容器的迭代器是支持随机访问的迭代器

(二)vector构造函数

功能描述:

  • 创建vector容器

函数原型:

  • vector<T> v;        //采用模版类实现,默认构造函数
  • vector(v.begin(),v.end());  //将v[begin(),end())区间中的元素拷贝给自身
  • vector(n,elem);   //构造函数将n个elem拷贝给本身
  • vector(const vector &vec); //拷贝构造函数
#include<iostream>
using namespace std;
#include <vector>
//vector容器构造
void printVector(vector <int> &v) {

	for (vector<int>::iterator it = v.begin(); it != v.end(); it++) {

		cout << *it<< " ";
	}

	cout << endl;

}



void test01()
{
 vector <int> v1;  //默认构造,无参构造

 for (int i = 0; i < 10; i++) {

	 v1.push_back(i);

 }
	 printVector(v1);

	 //通过区间的方式进行构造
	 vector<int> v2(v1.begin(), v1.end());

	 printVector(v2);

	 //n个elem方式构造
	 vector<int> v3(10, 100);

	 printVector(v3);
	 //拷贝构造
	 vector<int> v4(v3);

	 printVector(v4);

 



}



int main() {
	test01();

	system("pause");
	return 0;

}

(三)vector赋值操作

功能描述:

  • 给vector容器进行赋值

函数原型:

  • vector& operator =(const vector &vec);  //重载等号操作符
  • assign(beg,end);  //将[beg,end)区间的数据拷贝赋值给本身
  • assign(n,elem);  //将n个elem拷贝赋值给本身
#include <iostream>
using namespace std;
#include <vector>
void printVector(vector<int>& v) {

	for (vector<int>::iterator it = v.begin(); it != v.end(); it++) {

		cout << *it << " ";

	}
	cout << endl;

}



//vector 赋值
void test02() {

	vector <int> v1;
	for (int i = 0; i < 10; i++) {

		v1.push_back(i);
	}
	printVector(v1);
	//赋值
	vector<int> v2 = v1;
	printVector(v2);
	//assign
	vector<int> v3;
	v3.assign(v1.begin(), v1.end());
	printVector(v3);
	//n个elem
	vector<int> v4;
	v4.assign(10, 100);
	printVector(v4);


}

int main() {
	test02();

	system("pause");
	return 0;
}

(四)vector的容量大小

功能描述:

  • 对vector容器的容量大小的操作

函数原型:

  • empty();//判断容器是否为空
  • capacity();//容器的容量
  • size();//返回容器中元素的个数
  • resize(int num);//重新指定容器的长度为num,若容器变长,则以默认值填充新位置

                                 //如果容器变短,则末尾超出容器长度的元素被删除

  • resize(int num,elem); //重新指定容器的长度为num,若容器变长,则以elem值填充新位置。

                                          //如果容器变短,则末尾超出容器容器长度的元素被删除      

#include <iostream>
using namespace std;
#include <vector>


void printVector(vector<int>& v) {

	for (vector<int>::iterator it = v.begin(); it != v.end(); it++) {

		cout << *it << " ";

	}
	cout << endl;
}
void test01(){

	vector<int> v1;
	for (int i = 0; i < 10; i++) {

		v1.push_back(i);
	}
	printVector(v1);
	if (v1.empty()) {

		cout << "v1 为空" << endl;
	}
	else {

		cout << "v1不为空" << endl;
		cout << "v1的容量" << v1.capacity() << endl;//13 动态扩展
		cout << "v1的大小" << v1.size() << endl;
	}
	//重新指定大小
	v1.resize(15); //后面自动用0填充
	printVector(v1);
	cout << "v1的容量" << v1.capacity() << endl;
	cout << "v1的大小" << v1.size() << endl;

	//可以指定填充内容
	v1.resize(20, 100);
	printVector(v1);
	cout << "v1的容量" << v1.capacity() << endl;
	cout << "v1的大小" << v1.size() << endl;

	//比原来短 超出的部分会删掉
	v1.resize(5);
	printVector(v1);
	cout << "v1的容量" << v1.capacity() << endl;
	cout << "v1的大小" << v1.size() << endl;

}

int main() {

	test01();


	system("pause");
	return 0;
}

(五)Vecctor插入和删除

功能描述

  • 对vector容器进行插入,删除操作

函数原型:

  • push_back(ele);        //尾部插入元素ele
  • pop_back();      //删除最后一个元素
  • insert(const_iterator pos,ele);  //迭代器指向位置pos插入元素ele
  • insert(const_iterator pos ,int cout ,ele);//迭代器指向位置pos插入count个元素ele 
  • erase(const_iterator pos); //删除迭代器指向的元素
  • erase(const_iterator start,const_iterator end);//删除迭代器从start到end之间的元素
  • clear();//删除容器中所有元素
#include<iostream>
using namespace std;
#include <vector>
//vector插入和删除
/*push_back(ele);        //尾部插入元素ele
pop_back();      //删除最后一个元素
insert(const_iterator pos, ele);  //迭代器指向位置pos插入元素ele
insert(const_iterator pos, int cout, ele);//迭代器指向位置pos插入count个元素ele 
erase(const_iterator pos); //删除迭代器指向的元素
erase(const_iterator start, const_iterator end);//删除迭代器从start到end之间的元素
clear();//删除容器中所有元素*/
void printVector(vector<int>& v) {

	for (vector<int>::iterator it = v.begin(); it != v.end(); it++) {

		cout << *it << " ";


	}
	cout << endl;
}



void test01() {
	vector<int> v;
	v.push_back(10);
	v.push_back(20);
	v.push_back(30);
	v.push_back(40);
	v.push_back(50);
	printVector(v);

	//尾删
	v.pop_back();
	printVector(v);
	//迭代器插入
	v.insert(v.begin(), 100);
	printVector(v);
	//count个元素插入
	v.insert(v.begin(), 2, 200);
	printVector(v);

	//迭代器删除
	v.erase(v.begin());
	printVector(v);
	//迭代器区间删除
	//v.erase(v.begin(), v.end()); //清空
	v.clear();
	printVector(v);

}


int main() {

	test01();
	system("pause");
	return 0;

}

(六)vector数据存取

功能描述:

  • 对vector中的数据的存取操作

函数原型:

  • at(int idx);  //返回索引idx所指的数据
  • operator[ ];//返回索引idx所指的数据
  • front();//返回容器中第一个数据元素
  • back();//返回容器中最后一个数据元素
#include<iostream>
using namespace std;
#include <vector>
//vector容器 数据存取
void test01() {

	vector<int> v;
	for (int i = 0; i < 10; i++) {

		v.push_back(i);
	}
	//利用[]方式访问数组元素
	for (int i = 0; i < v.size(); i++) {
		cout << v[i] << " ";

	}
	cout << endl;

	//利用 at()方式访问数组元素
	for (int i = 0; i < v.size(); i++) {
		cout << v.at(i) << " ";
	}
	cout << endl;

	//利用front()和back()访问数组首尾元素
	cout << "front():" << v.front() << endl;
	cout << "back():" << v.back() << endl;
}
	int main() {
	test01();


		system("pause");
		return 0;


}

(七)vector 互换容器

功能描述

  • 实现两个容器内元素进行互换

函数原型:

  • swap(vec); //将vec与本身的元素互换
#include <iostream>
using namespace std;
#include <vector>

//vector 容器互换
void printVector(vector<int>& v) {

	for (vector<int>::iterator it = v.begin(); it != v.end(); it++) {

		cout << *it << " ";

	}
	cout << endl;
}

//1.基本使用
void test01() {
	vector<int> v1;
	for (int i = 0; i < 10; i++) {

		v1.push_back(i);
	}
	printVector(v1);

	vector<int> v2;
	for (int i = 10; i > 0; i--) {

		v2.push_back(i);
	}
	printVector(v2);
	cout << "交换前:" << endl;

	cout << "交换后:" << endl;
	v1.swap(v2);
	printVector(v1);
	printVector(v2);
}

//2.实际用途
void test02() {
	vector<int> v;
	for (int i = 0; i < 100000; i++) {
		v.push_back(i);
	}
	cout << "v的容量" << v.capacity() << endl;
	cout << "v的大小" << v.size() << endl;
	v.resize(3);//重新指定大小
	cout << "v的容量" << v.capacity() << endl; //13w
	cout << "v的大小" << v.size() << endl;

	//巧用swap收缩内存
	vector<int>(v).swap(v);//匿名对象会自动回收
	cout << "v的容量" << v.capacity() << endl; //3
	cout << "v的大小" << v.size() << endl;
	


}
int main() {
	test01();
	test02();
	system("pause");
	return 0;
}

(八)vector预留空间

功能描述:

  • 减少vector在动态扩展容量时的扩展次数

函数原型:

  • reserve(int len);//容器预留len个元素长度,预留位置不初始化,元素不可访问
#include <iostream>
using namespace std;
#include <vector>
//vector预留空间

void test01() {
	//vector预留空间
	
	vector<int> v;
	v.reserve(100000);
	int num = 0;//统计开辟次数  30次(不预留)
	int* p = NULL;
	for (int i = 0; i < 100000; i++) {

		v.push_back(i);
		if (p != &v[0]) {
			p=&v[0];
			num++;
		}
	}
	cout << "num=" << num << endl;
}

int main() {
	test01();

	system("pause");
	return 0;
}

三、deque 容器

(一)deque容器基本概念

功能:

  • 双端数组,可以对头端进行插入删除操作

deque与vector区别:

  • vector对于头部的插入删除效率低,数据量大,效率低
  • deque相对而言,对头部的插入删除速度比vector快
  • vector访问元素时的速度会比deque快,这和两者内部实现有关

deque内部工作原理: 

deque内部有个中控器,维护每段缓冲区中的内容,缓冲区中存放真实数据

中控器维护的是每个缓冲区的地址,使得使用deque时向一片连续的内存空间

  • deque容器的迭代器也是支持随机访问的

(二)deque构造函数

功能描述:

  • deque容器构造

函数原型:

  • deque<T> deq T;   //默认构造形式
  • deque(beg,end);//构造函数将[beg,end)区间的元素拷贝给本身
  • deque(n,elem);//构造函数将n个elem拷贝给本身
  • deque(const deque &deq);//拷贝构造函数

#include <iostream>
using namespace std;
#include <deque>
//deque 构造函数
void printDeque(const deque<int> &d){
    //如果加上const做修饰限定 那么迭代器也必须使用带有const的迭代器
    for(deque<int>::const_iterator it = d.begin();it !=d.end();it ++){
    	//*it=100;  使用const关键字限制了容器为只读状态,无法修改容器内的值
		
        cout<<*it <<" ";


    }
    cout << endl;

}
void test01()
{
    //1.默认构造
    deque<int> d1;
    for(int i=0;i<10;i++){

        d1.push_back(i);
    }

    printDeque(d1);
    //区间构造
    deque<int> d2(d1.begin(),d1.end());
    printDeque(d2);
    
    //n个element赋值
    deque<int> d3 (10,100);
    printDeque(d3);
    //4.拷贝构造
    deque<int> d4(d3);
    printDeque(d4);

    

}

int main(){
test01();


system("pause");
return 0;

}

(三)deque赋值操作

功能描述:

  • 给deque容器进行赋值

函数原型:

  • deque& operator =(const deque & deq);        //重载等号操作符
  • assign(beg,end);   //将[beg,end)区间中的函数拷贝赋值给本身
  • assign(n,elem);     //将n个elem拷贝给本身
#include <iostream>
using namespace std;
#include <deque>
//deque容器赋值操作
void printDeque(const deque<int>& d) {

	for (deque<int>::const_iterator it = d.begin(); it != d.end(); it++) {

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

}
void test01() {
	deque<int>d1;
	for (int i = 0; i < 10; i++) {

		d1.push_back(i);
	}
	printDeque(d1);
	//1.等号赋值  operator = 赋值
	deque<int> d2 = d1;
	printDeque(d2);
	// 2.assign() 区间赋值
	deque<int> d3;
	d3.assign(d1.begin(), d1.end());
	printDeque(d3);
	//3.assign n个 elemt 赋值
	deque<int> d4;
	d4.assign(10, 100);
	printDeque(d4);




}
int main() {
	test01();



	system("pause");
	return 0;
}

(四)deque大小操作

功能描述:

  • 对deque容器的大小进行操作

函数原型:

  • deque.empty( );   //判断容器是否为空
  • deque.size( );   //返回容器中的元素个数
  • deque.resize(num);   //重新指定容器的长度为num,若容器变长,则以默认值填充新位置

                                        //如果容器变短,则末尾超出容器长度的元素被删除

  • deque.resize(num,elem);  //重新指定容器的长度为num,若容器变长,则以elem填充新位置

                                                //如果容器变短,则末尾超出容器长度的元素被删除

#include <iostream>
using namespace std;
#include <deque>
//deque容器的大小操作
void printDeque(const deque<int> &d) {
	for (deque<int>::const_iterator it = d.begin(); it != d.end(); it++) {
		cout << *it << " ";

	}
	cout << endl;

}
void test01() {
	deque<int> d1;
	for (int i = 0; i < 10; i++) {
		d1.push_back(i);
	}
	printDeque(d1);

	if (d1.empty()) {
		cout << "d1为空" << endl;
	}
	else {
		cout << "d1不为空" << endl;
		cout << "d1的大小为:" << endl;
		//deque容器没有容量的概念

	}
	//重新指定大小
	//d1.resize(15);
	d1.resize(15,1);
	printDeque(d1);
	d1.resize(5);
	printDeque(d1);
}

int main() {

	test01();
	system("pause");
	return 0;

}

(五)deque插入和删除

功能描述:

  • 向deque容器中插入和删除数据

函数原型:

两端插入操作:

  • push_back(elem);       //在容器尾部添加一个数据
  • push_front(elem);      //在容器头部插入一个数据
  • pop_back( );             //删除容器最后一个数据
  • pop_front( );             //删除容器的第一个数据

指定位置操作:

  • insert(pos,elem);   //在pos位置插入一个elem元素的拷贝,返回新数据的位置。
  • insert(pos,n,elem);  //在pos位置插入n个elem数据,无返回值
  • insert(pos,beg,end); //在pos位置插入[beg,end)区间的数据,无返回值
  • clear( );                     //清空容器的所有数据
  • erase(beg,end);        //删除[beg,end ]的数据,返回下一个数据的位置
  • erase(pos);              //删除pos位置的数据,返回下一个数据的位置
#include <iostream>
using namespace std;
#include <deque>
//deque容器插入和删除
//两端操作
void printDeque(const deque<int>& d) {

	for (deque<int>::const_iterator it = d.begin(); it != d.end(); ++it) {
		cout << *it << " ";

	}
	cout << endl;

}


void test01() {
	deque<int> d1;
	//尾插
	d1.push_back(10);
	d1.push_back(20);
	//头插
	d1.push_front(30);
	d1.push_front(100);
	printDeque(d1); // 100 30 10 20

	//尾部删除
	d1.pop_back();
	printDeque(d1); // 100 30 10
	d1.pop_front();
	printDeque(d1); // 30 10

}
void test02() {
	deque<int> d2;
	d2.push_back(10);
	d2.push_back(20);
	d2.push_back(30);
	d2.push_back(40);
	d2.push_back(50);
	printDeque(d2); // 10 20 30 40 50

	//insert插入
	d2.insert(d2.begin(), 1000);
	printDeque(d2); // 1000 10 20 30 40 50
	d2.insert(d2.end(), 2000);
	printDeque(d2); // 1000 10 20 30 40 50 2000
	d2.insert(d2.begin(),2, 2000);
	printDeque(d2); // 2000 2000 1000 10 20 30 40 50 2000

	deque<int> d3;
	d3.push_back(1);
	d3.push_back(2);
	d3.push_back(3);

	d3.insert(d3.begin(), d2.begin(), d2.end());
	printDeque(d3); // 2000 2000 1000 10 20 30 40 50 2000 1 2 3
	deque<int>::iterator it = d3.begin();
	it++;
	d3.erase(it);
	printDeque(d3); //  2000 1000 10 20 30 40 50 2000 1 2 3
	//按照区间的方式删除
	d3.erase(d3.begin(), d3.end() - 3);
	printDeque(d3);   // 1 2 3
	d3.clear();
	printDeque(d3);   
	
}

int main() {
	test01();
	test02();
	system("pause");
	return 0;

}

总结:

  • 插入和删除提供的位置是迭代器
  • 尾插 --- push_back
  • 尾删 --- pop_back
  • 头插 --- push_front
  • 头删 --- pop_front

(六)deque数据存取

功能描述:

  • 对deque中的数据的存取操作

函数原型:

  • at(int idx);    //返回索引idx所指的数据
  • operator[ ];   //返回索引idx所指的数据
  • front( );        //返回容器中第一个数据元素
  • back( );       //返回容器中最后一个数据元素

#include <iostream>
using namespace std;
#include <deque>
//deque容器的存取操作
void test01() {
	deque<int> d;
	d.push_back(1);
	d.push_back(2);
	d.push_back(3);
	d.push_front(100);
	d.push_front(200);

	//通过 [ ] 访问元素
	for (int i = 0; i < d.size(); i++) {
		cout<<d[i]<<" ";

	}
	cout << endl;

	//通过 at() 访问元素
	for (int i = 0; i < d.size(); i++) {
		cout << d.at(i) << " ";
	}
	cout << endl;
	cout << "第一个元素为" << d.front() << endl;
	cout << "最后一个元素" << d.back()  << endl;

}

int main() {
	test01();

	system("pause");
	return 0;
}

(七)deque排序

功能描述:

  • 利用算法实现对deque容器排序

算法

  • sort(iterator beg,iterator end) //对beg和end 区间内的元素进行排序
#include <iostream>
using namespace std;
#include <deque>
#include<algorithm>
//deque容器的存取操作
void test01() {
	deque<int> d;
	d.push_back(1);
	d.push_back(2);
	d.push_back(3);
	d.push_front(100);
	d.push_front(200);
	//默认从小到大
	//对于支持随机访问的迭代器的容器,都可以利用sort排序

	sort(d.begin(),d.end()); //对容器进行排序
	//通过 [ ] 访问元素
	for (int i = 0; i < d.size(); i++) {
		cout<<d[i]<<" ";

	}
	cout << endl;
}

int main() {
	test01();

	system("pause");
	return 0;
}

四、stack容器

(一)stack 基本概念

概念:stack是一种先进后出的数据结构

  • 栈不允许有遍历行为
  • 栈可以判空
  • 栈可以返回元素

(二)stack常用接口

功能描述:栈容器常用对外接口

构造函数:

  • stack<T> stk;    //stack采用模版类实现,stack对象的默认构造形式
  • stack(const stack  &stk);    //拷贝构造函数

赋值操作:

  • stack& operator =(const stack &stk);//重载等号操作符

数据存取:

  • push(elem);    //向栈顶添加元素
  • pop();    //从栈顶移除第一个元素
  • top();    //返回栈顶元素

大小操作:

  • empty( );  //判断堆栈是否为空
  • size( );  //返回栈的大小
#include <iostream>
using namespace std;
//栈STACK 容器
#include <stack>

void test01() {
	//特点:符合先进后出数据结构
	stack<int> s;
	//入栈
	s.push(1);
	s.push(2);
	s.push(3);
	s.push(4);

	//只要栈不为空,查看栈顶,并执行出栈操作
	while (!s.empty()) {
		cout << s.top() << " ";
		s.pop();
		cout<<"栈中的数据个数:" << s.size() << endl;
	}
	cout << endl;
}

int main() {
	test01();

	system("pause");
	return 0;
}

五、queue容器

(一)queue基本概念

(二)queue 常用接口

功能描述:

  • queue<T> que;  //queue采用模板类实现,queue对象的默认构造形式
  • queue(const queue &que);  //拷贝构造函数

赋值操作:

  • queue& operator=(const queue &que);//重载等号操作符

数据存取:

  • push(elem);//往队尾添加元素
  • pop ();//从队头移除第一个元素
  • back();//返回最后一个元素
  • front ();//返回第一个元素

大小操作

  • empty();//判断堆栈是否为空
  • size(); //返回栈的大小
#include <iostream>
using namespace std;
#include <queue>
#include <string>
//queue用法

class Person{
    public:
    Person(string name ,int age){
        this->m_name = name;
        this->m_age = age;

    }
    string m_name;
    int m_age;
};



void test01(){
    //创建队列
    queue<Person> q;
    //准备数据
    Person p1 ("唐三藏",180);
    Person p2 ("孙悟空",660);
    Person p3 ("猪八戒",500);
    Person p4 ("沙和尚",440);

    //入队
    q.push(p1);
    q.push(p2);
    q.push(p3);
    q.push(p4);

    //判断只要队列不为空,查看队头,查看队尾,出队
    while (!q.empty()){
        //查看队头
        cout<<"队头元素---姓名: " << q.front().m_name << "年龄 : " <<q.front().m_age << endl;
        //查看队尾
        cout<<"队尾元素---姓名: " << q.back().m_name << "年龄 : " <<q.back().m_age << endl;
        //出队
        q.pop();
    }

}



int main() {
    test01();


    system("pause");
    return 0;
}

六、List容器

(一)list基本概念

功能:将数据进行链式存储

链表(list)是一种物理存储单元上非连续的存储结构,数据元素的逻辑顺序是通过链表中的指针链接实现的

链表的组成:链表由一系列节点组成

节点的组成:一个是存储数据元素的数据域,另一个是存储下一个节点地址的指针域

STL中的链表是一种双向循环链表

优点:

  • 可以对任意位置进行快速的插入或删除元素
  • 采用动态分配,不会造成内存的浪费和溢出
  • 链表执行插入和删除操作十分方便,修改指针即可,不需要移动大量元素

缺点:

  • 对于容器的遍历速度,没有数组快     占用的空间比数组大
  • 链表灵活,但是空间(指针域)和时间(遍历)额外耗费大

由于链表的存储方式并不是连续的内存空间,因此链表list中的迭代器只支持前移和后移,属于双向迭代器

List有一个重要的性质,插入操作和删除操作都不会造成原有迭代器的失效,这在Vector不成立

(二)List的构造函数

功能描述:

  • 创建list容器

函数原型:

  • list<T> lst;     //list采用模板类实现,对象的默认构造形式
  • list(beg,end);  //构造函数将[beg,end)区间的元素拷贝给本身
  • list(n,elem);  //构造函数将n个elem拷贝给本身
  • list(const list &lst);  //拷贝构造函数
#include <iostream>
using namespace std;
#include <list>
#include <string>
//list容器的打印函数
void printList(const list<int> &l){
    for(list<int>::const_iterator it =l.begin();it!=l.end();it++){
        cout<<*it<<" ";
    }
    cout<<endl;

}
void test01(){
    //创建list容器
    list<int> L1;
    L1.push_back(10);
    L1.push_back(20);
    L1.push_back(30);
    L1.push_back(40);
    L1.push_back(50);
    printList(L1);
    //区间方式构造
    list<int> L2(L1.begin(),L2.end());
    printList(L2);
    //拷贝构造
    list<int> L3(L2);
    printList(L3);
    //n个100
    list<int> L4(10,1000);
    printList(L4);

}

int main() {
    test01();
    system("pause");
    return 0;
}

(三)list赋值与交换

功能描述:

  • 给list容器进行赋值,以及交换list容器

函数原型:

  • assign(beg,end);//将[beg,end)区间的数据拷贝给本身
  • assign(n,elem); //将n个elem赋值给本身
  • list& operator =(const list &lst);//重载等号操作符
  • swap(lst);//将lst与本身的元素互换
#include <iostream>
using namespace std;
#include <list>
#include <string>
//list 赋值与转换
//赋值
void printList(const list<int> &L)
{
    for(list<int>::const_iterator it = L.begin();it!=L.end(); it++)
        {
            cout<<*it<<" ";
        }
    cout<<endl;    
}
void test01()
{
    list<int> L1;
    L1.push_back(10);
    L1.push_back(20);
    L1.push_back(30);
    L1.push_back(40);
    printList(L1);
    list<int> L2;
    L2=L1; // operator = 赋值
    printList(L2);
    list<int> L3;
    L3.assign(L2.begin(),L2.end());
    printList(L3);
    list<int> L4;
    L4.assign(10,100);
    printList(L4);
}
void test02()
{   
    list<int> L1;
    L1.push_back(10);
    L1.push_back(20);
    L1.push_back(30);
    L1.push_back(40);
    list<int> L2;
    L2.assign(10,100);
    cout<<"交换前: "<<endl; 
    printList(L1);
    printList(L2);
    L1.swap(L2);
    cout<<"交换后: "<<endl;
    printList(L1);
    printList(L2);
}
int main(){
    //test01();
    test02();
    system("pause");
    return 0;
}

(四)list大小操作

功能描述:

  • 对list容器的大小进行操作

函数原型:

  • size( );  //返回容器中元素的个数
  • empty( )  //判断容器是否为空
  • resize(num);  //重新制定容器的长度为num,若容器边长,则以默认值填充新位置
                          //如果容器变短,则末尾超出容器长度的元素被删除
  • resize(num,elem);  //重新制定容器的长度为num,若容器变长,则以elem填充新位置
                                     //如果容器变短,则末尾超出容器长度的元素被删除
#include <iostream>
using namespace std;
#include <list>
//list容器的大小操作
void printList(const list<int> &L)
{
    for(list<int>::const_iterator it =L.begin();it !=L.end();it++)
    {
        cout<< *it <<" ";
    }
    cout<<endl;
}

void test01()
{
    list<int> L1;
    L1.push_back(20);
    L1.push_back(20);
    L1.push_back(30);
    L1.push_back(40);
    printList(L1);
    //判断容器是否为空
    if (L1.empty())
    {
        cout << "L1为空" <<endl;
    }
    else
    {
        cout << "L1不为空" << endl;
        cout << "L1的元素个数为:" <<L1.size() << endl;
    }
    //重新指定大小
    L1.resize(10,10000);
    printList(L1);
    L1.resize (2);
    printList(L1);
}

int main()
{
    test01();
    system("pause");
    return 0;

}

(五)list插入和删除

功能描述:

  • 对list容器进行数据的插入和删除

函数原型:

  • push_back(elem);  //在容器尾部加入一个元素
  • pop_back();  //删除容器中最后一个元素
  • push_front(elem);  //在容器开头插入一个元素
  • pop_front();  //在容器开头移除第一个元素
  • insert(pos,elem);  //在pos位置插入elem元素的拷贝,返回新数据的位置
  • insert(pos,n,elem); //在pos位置中插入n个elem数据,无返回值
  • insert(pos,beg,end);//在pos位置插入[beg,end)区间的数据,无返回值
  • clear();//移除容器所有数据
  • erase(beg,end);//删除[beg,end)区间的数据,返回下一个数据的位置
  • erase(pos);//删除pos位置的数据,返回下一个数据的位置
  • remove(elem);//删除容器中所有与elem值匹配的元素
#include <iostream>
using namespace std;
#include <list>
//list容器的插入与删除
/*
push_back(elem);  //在容器尾部加入一个元素
pop_back();  //删除容器中最后一个元素
push_front(elem);  //在容器开头插入一个元素
pop_front();  //在容器开头移除第一个元素
insert(pos,elem);  //在pos位置插入elem元素的拷贝,返回新数据的位置
insert(pos,n,elem); //在pos位置中插入n个elem数据,无返回值
insert(pos,beg,end);//在pos位置插入[beg,end)区间的数据,无返回值
clear();//移除容器所有数据
erase(beg,end);//删除[beg,end)区间的数据,返回下一个数据的位置
erase(pos);//删除pos位置的数据,返回下一个数据的位置
remove(elem);//删除容器中所有与elem值匹配的元素
*/
void printList(const list<int> &L)
{
    for(list<int>::const_iterator it =L.begin();it !=L.end();it++)
    {
        cout<< *it <<" ";
    }
    cout<<endl;
}

void test01()
{
    list<int> L1;
    //尾部插入
    L1.push_back(20);
    L1.push_back(20);
    L1.push_back(30);
    L1.push_back(40);
    //头部插入
    L1.push_front(50);
    L1.push_front(60);
    printList(L1); //60 50 20 20 30 40
    //尾部删除
    L1.pop_back();//60 50 20 20 30
    //头部删除
    L1.pop_front();// 50 20 20 30
    //insert 插入
    L1.insert(L1.begin(),1000);
    printList(L1); //1000 50 20 20 30 
    //删除
    list<int>::iterator it =L1.begin();
    L1.erase(it);//50 20 20 30
    L1.erase(++it);// 50 20 30
    //移除
    L1.push_back(10000);// 50 20 30 10000
    L1.push_back(10000);// 50 20 30 10000 10000
    L1.remove(10000); // 50 20 30 
    //清空
    L1.clear();
   
}

int main()
{
    test01();
    system("pause");
    return 0;

}

(六)数据存取

功能描述:

  • 对list容器中数据进行存取

函数原型:

  • front( ); //返回第一个元素
  • backl( ); //返回最后一个元素
#include <iostream>
using namespace std;
#include <list>
//list容器  数据存取

void printList(const list<int> &L)
{
    for(list<int>::const_iterator it =L.begin();it !=L.end();it++)
    {
        cout<< *it <<" ";
    }
    cout<<endl;
}

void test01()
{
    list<int> L1;
    //尾部插入
    L1.push_back(20);
    L1.push_back(20);
    L1.push_back(30);
    L1.push_back(40);
    //List本质是链表,不是用连续线性空间存储数据,迭代器也是不支持随机访问的  不能跳跃性的取数据 只能 ++/--
    cout<<"第一个元素为:" << L1.front() << endl;
    cout<<"最后一个元素为:" <<L1.back() << endl;
}
int main()
{
    test01();
    system("pause");
    return 0;
}

(七)list 反转和排序

功能描述:

  • 将容器中的元素反转,以及将容器中的数据进行排序

函数原型:

  • reverse(); //反转链表
  • sort(); //链表排序
#include <iostream>
using namespace std;
#include <list>
#include <algorithm>
//list容器的反转和排序
bool myCompare(int v1,int v2)
{
    //降序 就让第一个数大于第二个数
    return v1 > v2;
}
void printList(const list<int> &L)
{
    for(list<int>::const_iterator it =L.begin();it !=L.end();it++)
    {
        cout<< *it <<" ";
    }
    cout<<endl;
}

void test01()
{
    list<int> L1;
    L1.push_back(20);
    L1.push_back(10);
    L1.push_back(30);
    L1.push_back(40);
    L1.push_back(50);
    printList(L1); //20 10 30 40 50 
    //反转
    L1.reverse();
    printList(L1); //50 40 30 10 20
    //排序
    //所有不支持随机访问的迭代器的容器,不可以用标准算法排序
    //不支持随机访问迭代器的容器,内部会提供对应的一些算法
    cout<< "排序前:" <<endl;
    printList(L1);
    //sort(L1.begin(),L1.end());  错误
    L1.sort(); //默认升序
    L1.sort(myCompare);//降序排列

}
int main()
{
    test01();
    system("pause");
    return 0;
}

七、set容器

(一)set容器基本概念

简介:

  • 所有元素都会在插入时自动去排序

本质:

  • set/multiset属于关联式容器,底层结构是用二叉树实现的

set和multiset的区别:

  • set容器不允许有重复的元素
  • multiset允许有重复的元素

(二)set构造和赋值

功能描述:创建set容器以及赋值

构造:

  • set<T> st;  //默认构造函数
  • set(const set &st); //拷贝构造函数

赋值:

  • set& operator = (const set &st);  //重载等号操作符
#include<iostream>
using namespace std;
#include<set>
//set 容器构造和赋值
void printSet(set<int> &s)
{
    for(set<int>::iterator it = s.begin();it !=s.end();it++)
    {
        cout<<*it<<" ";
    }
    cout<<endl;
}
void test01()
{
    set<int> s1;
    //插入数据只有insert的方式
    s1.insert(65);
    s1.insert(60);
    s1.insert(40);
    s1.insert(70);
    //set容器的特点 1.所有容器插入时自动排序   2.set容器不允许插入重复值  
    printSet(s1);
    //拷贝构造
    set<int>s2(s1);
    printSet(s2);
    //等号赋值
    set<int> s3;
    s3=s2;
    printSet(s3);
}

int main()
{
    test01();
    system("pause");
    return 0;

}

总结:

  • set容器插入数据时用insert
  • 色图容器哦插入的数据会自动排序

(三)set大小和交换

功能描述:

  • 统计set容器大小以及交换set容器

函数原型:

  • size();  //返回容器中元素的数目
  • empty();//判断容器是否为空
  • swap();//交换两个集合容器
#include<iostream>
using namespace std;
#include<set>
//set 容器大小和交换
void printSet(set<int> &s)
{
    for(set<int>::iterator it = s.begin();it !=s.end();it++)
    {
        cout<<*it<<" ";
    }
    cout<<endl;
}
//大小
void test01()
{
    set<int> s1;
    //插入数据只有insert的方式
    s1.insert(65);
    s1.insert(60);
    s1.insert(40);
    s1.insert(70);
    //判断容器是否为空
    if(s1.empty())
    {
        cout << "容器为空" << endl;
    }else
    {
        cout <<"容器不为空" << endl;
        cout <<"容器的大小为" << s1.size() << endl;
    }

    
}
//交换
void test02()
{
    set<int> s1;
    //插入数据只有insert的方式
    s1.insert(65);
    s1.insert(60);
    s1.insert(40);
    s1.insert(70);
    set<int> s2;
    //插入数据只有insert的方式
    s2.insert(10);
    s2.insert(30);
    s2.insert(20);
    s2.insert(40);
    cout << "交换前:" <<endl;
    printSet(s1);
    printSet(s2);

    cout << "交换前:" <<endl;
    s1.swap(s2);
    printSet(s1);
    printSet(s2);
    
}

int main()
{
    test01();
    test02();
    system("pause");
    return 0;

}

(四)set插入和删除

功能描述:

  • set容器进行插入数据和删除数据

函数原型:

  • insert(elem);  //在容器中插入元素
  • clear();  //清楚所有元素
  • erase(pos);  //删除pos迭代器所指的元素,返回下一个元素的迭代器
  • erase(beg,end);  //删除区间[beg,end)的所有元素,返回下一个元素的迭代器
  • erase(elem);  //删除容器中值为elem的元素
#include<iostream>
using namespace std;
#include<set>
//set 容器的插入和删除
void printSet(set<int> &s)
{
    for(set<int>::iterator it = s.begin();it !=s.end();it++)
    {
        cout<<*it<<" ";
    }
    cout<<endl;
}
//大小
void test01()
{
    set<int> s1;
    //插入数据只有insert的方式
    s1.insert(65);
    s1.insert(60);
    s1.insert(40);
    s1.insert(70);
    printSet(s1);
    //删除
    s1.erase(s1.begin()); //删除了第一个元素
    printSet(s1);
    //删除重载版本
    s1.erase(60);
    printSet(s1);
    //清空
    //s1.erase(s1.begin(),s1.end());
    s1.clear();
    printSet(s1);


    
}


int main()
{
    test01();
    
    system("pause");
    return 0;

}

(五)set容器的查找和统计

功能描述:

  • 对set容器进行查找数据以及统计数据

函数原型:

  • find(key);  //查找key是否存在,若存在,返回该键的元素的迭代器;若不存在,返回set.end()
  • count(key);  //统计key的元素个数
#include<iostream>
using namespace std;
#include<set>
//set 容器的查找和统计
void printSet(set<int> &s)
{
    for(set<int>::iterator it = s.begin();it !=s.end();it++)
    {
        cout<<*it<<" ";
    }
    cout<<endl;
}
//大小
void test01()
{
    set<int> s1;
    //插入数据只有insert的方式
    s1.insert(65);
    s1.insert(60);
    s1.insert(40);
    s1.insert(70);
    printSet(s1);
    //查找
    //因为查找时返回的是迭代器,所以要用迭代器接受结果
    set<int>::iterator pos =s1.find(400);
    if(pos!=s1.end())
    {
        cout<<"找到元素"<<*pos <<endl;
    }else{
        cout<<"未找到元素"<<endl;
    }
}
    //统计
    void test02(){
    set<int> s1;
    //插入数据只有insert的方式
    s1.insert(65);
    s1.insert(60);
    s1.insert(40);
    s1.insert(70);
    s1.insert(70);
    s1.insert(70);

    int num =s1.count(70);
    //对于set来说结果不是0就是1 因为set中不允许有重复元素
    cout<<"num="<<num<<endl;
    }

int main()
{
    test01();
    test02();
    
    system("pause");
    return 0;

}

(六)set和multiset区别

区别:

  • set不可以插入重复数据,而multiset可以
  • set插入数据的同时会返回插入结果,表示插入成功
  • multiset不会检测数据,因此可以插入重复数据
#include<iostream>
using namespace std;
#include<set>
//set 容器和multiset的区别
void printSet(set<int> &s)
{
    for(set<int>::iterator it = s.begin();it !=s.end();it++)
    {
        cout<<*it<<" ";
    }
    cout<<endl;
}
void test01()
{
    set<int> s1;
    //插入数据只有insert的方式
    s1.insert(65); //插入时会检测
    s1.insert(60);
    s1.insert(40);
    //用队组接收结果
    pair<set<int>::iterator,bool> ret = s1.insert(70);
    if(ret.second){
        cout<<"第一次插入成功"<<endl;
    }else{
        cout<<"第一次插入失败"<<endl;
    }
    ret =s1.insert(70);
        if(ret.second){
        cout<<"第二次插入成功"<<endl;
    }else{
        cout<<"第二次插入失败"<<endl;
    }
    multiset<int> s2; //允许插入重复的值
    s2.insert(10);  //直接插不检测
    s2.insert(20);
    for(multiset<int>::iterator it = s2.begin();it!=s2.end();it++){
        cout<<*it<<" ";
    }
    cout<<endl;
   
}
int main()
{
    test01();
    system("pause");
    return 0;

}

(七)pair队组创建

功能描述:

  • 成对出现的数据,利用对组可以返回两个数据

两种创建方式:

  • pair<type,type> p (value1,value2);
  • pair<type,type> p =make_pair(value1,value2);
#include<iostream>
using namespace std;
#include<string>
//pair对组的创建
void test01(){
    //第一种方式
    pair<string,int> p ("Tom",19);
    cout<<"姓名:" <<p.first <<",年龄:" <<p.second <<endl;
    //第二种方式
    pair<string,int> p2 = make_pair("Jerry",20);
    cout<<"姓名:" <<p2.first <<",年龄:" <<p2.second <<endl;

}
int main(){
    test01();

    system("pause");
    return 0;
}

(八)set容器排序

主要技术点:

  • 利用仿函数,可以改变排序规则
#include <iostream>
using namespace std;
#include<string>
#include<set>
//仿函数
class MyCompare{
    public:
        bool operator()( const int a,const int b) const{
            return a>b;
        }
};
//set 容器排序
void test01(){
    set<int> s1;
    s1.insert(10);
    s1.insert(60);
    s1.insert(50);
    s1.insert(20);
    s1.insert(30);
    for(set<int>::iterator it = s1.begin();it!=s1.end();it++){
        cout<<*it<<" ";
    }
    cout<<endl;
    //指定排序规则  制定排序 从大到小
    
    set<int,MyCompare> s2;
    s2.insert(10);
    s2.insert(60);
    s2.insert(50);
    s2.insert(20);
    s2.insert(30);
    for(set<int,MyCompare>::iterator it = s2.begin();it!=s2.end();it++){
        cout<<*it<<" ";
    }
    cout<<endl;
}

int main(){

    test01();
    system("pause");
    return 0;
}
#include <iostream>
using namespace std;
#include <set>
#include <string>
// set容器排序,存放自定义数据类型
class Person{
    public:
    Person(string name,int age){
        this->m_name = name;
        this->m_age = age;
    }
    string m_name;
    string m_age;
};
class ComparePerson{
    bool operator()(const Person& p1,const Person& p2) const
    {
        //按照年龄排序
        return p1.m_age > p2.m_age;
    }
};
void test01(){
    //自定义的数据类型,都会指定排序规则
    set<Person,ComparePerson> s;
    //创建Person对象
    Person p1("Tom",20);
    Person p2("Jerry",25);
    Person p3("Mike",30);
    s.insert(p1);
    s.insert(p2);
    s.insert(p3);

    for(set<Person,ComparePerson>::iterator it = s.begin();it!=s.end();it++){
        cout<<"姓名: "<<it->m_name <<" 年龄:" <<it->m_age<<endl;
    }

}

int main(){
    test01();
    system("pause");
    return 0;
}

八、map/multimap容器

(一)map基本概念

简介:

  • map中所有的元素都是pair
  • pair中第一个元素为key(键值),起到索引的作用,第二个元素为value(实值)
  • 所有元素都会根据元素的键值自动排序

本质:

  • map/multimap属于关联式容器,底层结构使用二叉树实现的

有点:

  • 可以根据key值快速找到value值

map和multimap的区别:

  • map不允许容器中有重复的key值元素
  • multimap允许容器有重复key值元素

(二)map构造和赋值

功能描述:

  • 对map容器进行构造和赋值操作

函数原型:

构造:

  • map<T1,T2> mp;  //map默认构造函数
  • map(const map &map);  //拷贝构造函数

赋值:

  • map& operator =(const map &map);重载等号操作符
#include<iostream>
using namespace std;
#include<map>
void printMap(map<int,int> &m){
    for(map<int,int>::iterator it=m.begin();it!=m.end();it++){
        cout<<"Key:"<<it->first<<"value:"<<it->second<<endl;
    }
    cout<<endl;
}

void test01(){
    //创建map容器
    map<int,int> m;
    m.insert(pair<int,int>(1,10));
    m.insert(pair<int,int>(2,20));
    m.insert(pair<int,int>(3,30));
    m.insert(pair<int,int>(4,40));
    m.insert(pair<int,int>(5,50));
    printMap(m);
    //拷贝构造
    map<int,int> m2(m);
    printMap(m2);


}
int main(){
    test01();
    system("pause");
    return 0;
}

(三)map大小和交换

功能描述:

  • 统计map容器大小以及交换map容器

函数原型:

  • size(); //返回容器中元素的数目
  • empty();//判断容器是否为空
  • swap(st); //交换两个集合容器
#include<iostream>
using namespace std;
#include<map>
void printMap(map<int,int> &m){
    for(map<int,int>::iterator it=m.begin();it!=m.end();it++){
        cout<<"Key:"<<it->first<<"value:"<<it->second<<endl;
    }
    cout<<endl;
}

void test01(){
    //创建map容器
    map<int,int> m;
    m.insert(pair<int,int>(1,10));
    m.insert(pair<int,int>(2,20));
    m.insert(pair<int,int>(3,30));
    m.insert(pair<int,int>(4,40));
    m.insert(pair<int,int>(5,50));
    printMap(m);
    cout<<"m的大小为"<<m.size()<<endl;
    //拷贝构造
    map<int,int> m2;
    m2.insert(pair<int,int>(1,100));
    m2.insert(pair<int,int>(2,200));
    m2.insert(pair<int,int>(3,300));
    m2.insert(pair<int,int>(4,400));
    m2.insert(pair<int,int>(5,500));
    printMap(m2);
    cout<<"m2的大小为"<<m2.size()<<endl;
    m2.swap(m);
    printMap(m2);
    printMap(m);
    if(m2.empty()){
        cout<<"m2为空"<<endl;
    }else{
        cout<<"m2不为空"<<endl;
    }


}
int main(){
    test01();
    system("pause");
    return 0;
}

 (四)map插入和删除

功能描述:

  • map容器进行插入数据和删除数据

函数原型:

  • insert(elem);  //在容器中插入元素
  • clear();  //清楚所有元素
  • erase(pos);//删除pos迭代器所指的元素,返回下一个元素的迭代器
  • erase(beg,end);//删除区间[beg,end)的所有元素,返回下一个元素的迭代器
  • erase(key);//删除容器中值为key的元素
#include<iostream>
using namespace std;
#include<map>
//map容器插入和删除
void printMap(map<int,int> &m){
    for(map<int,int>::iterator it=m.begin();it!=m.end();it++){
        cout<<"Key:"<<it->first<<"value:"<<it->second<<endl;
    }
    cout<<endl;
}
void test01(){
    map<int,int> m;
    //插入第一种
    m.insert(pair<int,int>(1,10));
    //插入第二种
    m.insert(make_pair(2,20));
    //插入第三种
    m.insert(map<int,int>::value_type(3,30));
    //第四种
    m[4] = 40;  //不建议使用 容易出错  如果索引处没有 会自动创建一个 0的值
    cout<<m[5]<<endl; //如果索引处没有 会自动创建一个 0的值
    printMap(m);

    //删除
    m.erase(m.begin());
    printMap(m);
    m.erase(2);  //按照key删除
    printMap(m);

   // m.erase(m.begin(),m.end());
   m.clear();
    printMap(m);


}


int main(){
    test01();
    system("pause");
    return 0;

}

(五)map查找和统计

功能描述:

  • 对map容器进行查找数据以及统计数据

函数原型:

  • find(key);  //查找key是否存在,若存在,返回改键的元素的迭代器;若不存在,返回set.end();
  • count(key);//统计key的元素个数
#include<iostream>
using namespace std;
#include<map>
//map容器查找和统计
void printMap(map<int,int> &m){
    for(map<int,int>::iterator it=m.begin();it!=m.end();it++){
        cout<<"Key:"<<it->first<<"value:"<<it->second<<endl;
    }
    cout<<endl;
}
void test01(){
    map<int,int> m;
    //插入第一种
    m.insert(pair<int,int>(1,10));
    //插入第二种
    m.insert(make_pair(2,20));
    //插入第三种
    m.insert(map<int,int>::value_type(3,30));
    //第四种
    m[4] = 40;  //不建议使用 容易出错  如果索引处没有 会自动创建一个 0的值
    cout<<m[5]<<endl; //如果索引处没有 会自动创建一个 0的值
    //查找
    map<int,int>::iterator pos = m.find(1);
    if(pos !=m.end()){
        cout<<"找到了元素key=" <<(*pos).first<<"value="<<(*pos).second<<endl;
    }else{
        cout<<"没找到元素"<<endl;
    }
    //统计
    int count = m.count(1);
    cout<<"count="<<count<<endl;

}

int main(){
    test01();
    system("pause");
    return 0;

}

(六)map容器排序

主要技术点:

  • 利用仿函数,可以改变排序规则
#include<iostream>
using namespace std;
#include<map>
class myCompare{

public:
    bool operator()(const int&a,const int& b) const{
        return a>b;
    }
};
//map容器排序
void printMap(map<int,int,myCompare> &m){
    for(map<int,int>::iterator it=m.begin();it!=m.end();it++){
        cout<<"Key:"<<it->first<<"value:"<<it->second<<endl;
    }
    cout<<endl;
}
void test01(){
    map<int,int,myCompare> m;
    m.insert(make_pair(1,10));
    m.insert(make_pair(2,20));
    m.insert(make_pair(3,30));
    m.insert(make_pair(4,40));
    m.insert(make_pair(5,50));
    for(map<int,int,myCompare>::iterator it=m.begin();it!=m.end();it++){
        cout<<"Key:"<<it->first<<"value:"<<it->second<<endl;
    }
    cout<<endl;


}


int main(){
    test01();
    system("pause");
    return 0;

}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值