【C++知识点】容器:list容器、map容器

本文详细探讨了C++中的两种重要容器——list和map。list容器主要关注其双链表结构,讨论了插入、删除和迭代器操作的效率。map容器则讲解了红黑树实现的映射关系,以及如何高效地进行查找、插入和更新键值对。通过实例代码,读者将更好地掌握这两种容器在实际编程中的应用。
摘要由CSDN通过智能技术生成

// 2021.3.23(stl容器).cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <windows.h>
#include <iostream>
#include <vector>
#include <list>
#include <map>
#include <string>

using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
	vector<int> VecNum;
	VecNum.push_back(5);
	VecNum.push_back(6);
	VecNum.push_back(6);
	VecNum.push_back(7);
	VecNum.push_back(9);
	VecNum.push_back(11);

	//容器名称[索引]
	for (int i = 0; i < VecNum.size(); i++)
	{
		cout << VecNum[i] << endl;
	}

	//C++11新语法
	//遍历输出容器中的数据
 	for (int nValue : VecNum)
 	{
 		cout << nValue << endl;
 	}

	//修改容器中的数据要用引用&
	for (int& nValue : VecNum)
	{
		nValue = 100;  //将容器中的数据均改为100
		cout << nValue << endl;
	}


	//vector<int>::iterator 是迭代器类型
	vector<int>::iterator iter =  VecNum.begin() + 3;//返回容器第3个元素的迭代器

	VecNum.erase(VecNum.begin() + 2);  //移除第2个元素

	VecNum.end();  //返回容器末尾的迭代器,标志容器的结束
	cout << *iter << endl;

	//通过迭代器遍历容器
 	for (vector<int>::iterator iter = VecNum.begin(); iter != VecNum.end(); ++iter)
 	{
 		cout << *iter << endl;
 	}

	for (vector<int>::const_iterator iter = VecNum.begin(); iter != VecNum.end(); )  //常迭代器不可被修改
	{
		if (6 == *iter)
		{
			//erase返回指向下一个元素的迭代器
			iter = VecNum.erase(iter);
			//*iter = 100;
		}
		else{
			++iter;
		}
	}
 

	VecNum.clear();  //清空数据
	VecNum.pop_back();  //从后往前弹出
	cout << VecNum.at(2) << endl;  //输出第2个
	cout << VecNum.back() << endl;  //输出最后一个


	vector<int>::const_iterator iter = VecNum.cbegin();//返回第一个元素的常迭代器
	VecNum.cend();




	cout << "-------------------------------------------------- list容器 -------------------------------------------------------------";

	//定义
	//	list<类型> 容器名称;
	list<int> listNum;
	listNum.push_back(5);
	listNum.push_back(6);
	listNum.push_back(6);
	listNum.push_back(7);
	listNum.push_back(8);
	listNum.push_back(9);

	
	list<int>::iterator iter = listNum.begin();
	list<int>::const_iterator iter = listNum.cbegin();  //返回第一个元素的常迭代器
	cout << *iter << endl;


	//重要★★★
	for (list<int>::iterator iter = listNum.begin(); iter != listNum.end();)
	{
		if (6 == *iter)
		{
			iter = listNum.erase(iter);   //返回移除后的迭代器
		}
		else{
			++iter;
		}
	}

	listNum.pop_back(); //弹出
	listNum.end();
	listNum.back();    //返回最后一个元素的值
	listNum.empty();  //判空
	listNum.size();   //个数
	listNum.clear();  //清空
	listNum.front();  //返回第一个元素的值
	 	
	//遍历输出
	for (list<int>::iterator iter = listNum.begin(); iter != listNum.end(); ++iter)
	{
		cout << *iter << endl;
	}





	cout << "-------------------------------------------------- map容器(键 值) -------------------------------------------------------------";

	//	键 值
	//map<键的类型 , 值的类型> 容器名称;
	//键的类型(一般类型 int ,string 等) ;值的类型(任意类型:包括结构体类型等)
	map<int, string> mapName;

	mapName[5] = "A老师";   //数字5是键,字符串"A老师"是值
	mapName[8] = "B老师";
	mapName[10] = "C老师";
	mapName[11] = "D老师";

	mapName.insert(pair<int, string>(12, "E老师"));  //插入新的键值对

	mapName[5] = "F老师";  //修改键为5的数据,因为键是唯一的
	cout << mapName[12] << endl;
	cout << mapName.at(12) << endl;


	map<int, string>::iterator iter1 = mapName.begin();
	//两种访问键值的写法
	cout << iter1->first << ":" << iter1->second << endl;  //first指的是键,second指的是值
	cout << (*iter1).first << ":" << (*iter1).second << endl;


	//移除值为 "B老师" 的键值对
	for (map<int, string>::iterator iter = mapName.begin(); iter != mapName.end();)
	{
		cout << iter->first << ":" << iter->second << endl;
		if (iter->second == "B老师")
		{
			iter = mapName.erase(iter);
		}
		else{
			++iter;
		}
	}

	//遍历输出
	for (map<int, string>::iterator iter = mapName.begin(); iter != mapName.end(); ++iter)
	{
		cout << iter->first << ":" << iter->second << endl;
	}

	mapName.clear();
	mapName.size();

	//找到的话返回它的迭代器,如果没有找到返回mapName.end()的迭代器
	map<int, string>::iterator iter2 = mapName.find(5);
	if (iter2 != mapName.end())
	{
		cout << iter2->first << ":" << iter2->second << endl;
	}


	system("pause");
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值