关于map && set && vector的使用

本文深入解析C++标准模板库(STL)中的map、set和vector容器的使用方法,包括元素的插入、查找、删除和遍历等关键操作,以及迭代器的使用技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

//关于map的用法
map是STL的一个容器,它提供一对一的hash(哈希表)
第一个参数为key,每一个关键字在map中只能出现一次
第二个参数为该关键字的值
map以模板方式实现,可以存储任意类型的变量,包括使用者自定义的变量
map内部的实现自建一颗红黑树,这棵树具有对数据自动排序的功能。

#include
#include
using namespace std;
int main()
{
//1、变量声明
map<int, string> mapTest;

//iter迭代器
map<int, string>::const_iterator iter;

//2、插入元素 
//用insert函数插入pair
mapTest.insert(pair<int, string>(2, "123"));
//用数组插入
mapTest[0] = "456";
mapTest[1] = "789";
mapTest[3] = "jgiorjgop";
mapTest[4] = "roegfdhotgifbjiojvbj";

//输出所有Pair元素  迭代器遍历 map
for (iter=mapTest.begin(); iter != mapTest.end();iter++)
{
	//map的迭代器,可以使用first访问std::pair的第一个成员(type1)
	//			   可以使用second访问第二个成员(type2)
	printf("%d=>%s \n",iter->first,iter->second.c_str()); //c_str()不建议使用
}

//3、查找
//出现时,它会返回资料所在位置;如果没有,返回iter与end的返回值相同
iter=mapTest.find(0);
 //没有查找到最后 就是可以查找到 如果 iter==mapTest.end 表示已经查找到最后  就是没有查找到
if (iter != mapTest.end())
{
	printf("Find,the value is:%s \n",iter->second.c_str());  //返回资料所在的位置

/*在此处补充一点内容:
printf能输出string类型的变量吗?
实践证明是不能的,string是类,printf只能打印基本的类型。
解决方法:
String s;
cout<<s<<endl;
或者: printf(“%s”,s.c_str());
*/

}
else
{
	printf("do not find\n");
}

//4、删除、清空
//清空map中的数据可以用clear()函数
//判断map是否有数据可以使用empty()函数,它返回true则说明是空map
//资料的删除要用到erase函数,它有三个overload函数

//迭代器删除
iter = mapTest.find(0);
mapTest.erase(iter);
//用关键字删除  如果删除成功返回1,否则返回0
int ret = mapTest.erase(1);
if (ret == 1)
{
	printf("删除成功\n");
}
else
{
	printf("删除失败\n");
}
printf("删除个别数据后:\n");
for (iter = mapTest.begin(); iter != mapTest.end(); iter++)
{
	printf("%d=>%s \n", iter->first, iter->second.c_str()); 
}
//用迭代器范围删除,把整个map清空
mapTest.erase(mapTest.begin(),mapTest.end());

printf("删除全部数据后:\n");
for (iter = mapTest.begin(); iter != mapTest.end(); iter++)
{
	printf("%d=>%s \n", iter->first, iter->second.c_str());
}
//效果等同于
//mapTest.clear();
system("pause");
return 0;

}

//关于set的用法
/*vector封装数组,list封装了链表,map与set封装了二叉树
set关联式容器,set作为一个容器用来存储同一数据类型,并且能从一个数据集合中取出数据。
在set中每一个元素值都是唯一的,系统能根据元素值自动排序,注意set中元素的值不能被直接改变。
*/
#include
#include <stdio.h>
#include
using namespace std;

int main()
{
int i;
int arr[5] = {0,1,2,3,4};

//1、变量声明
set<int> iset(arr,arr+5);

//2、插入
iset.insert(5);    //012345

printf("size:%d\n",iset.size());
printf("3 count:%d\n",iset.count(3));

//3、清空、清除
iset.erase(1);

//4、输出
set<int>::iterator iter1 = iset.begin();
set<int>::iterator iter2 = iset.end();
for (; iter1 != iter2;iter1++)
{
	printf("*iter1:%d\n",*iter1);
}

//5、查找
iter1 = iset.find(3);
if (iter1 != iset.end())
{
	printf("find succeed\n");
}

system("pause");
return 0;

}

map中iterator、const_iterator与const iterator的区别:
1、 如果你传递过来一个const类型的容器,那么只能用const_iterator来遍历
Void Method(const vector vInt)
{
Vector::const_iterator iter;
}
定义了一个const_iterator迭代器,这个迭代器是可以增加的,但是其所指的元素是不可以被改变的。
For(iter=vv.begin();iter!vv.end();iter++)
cout<<*iter<,endl; //这样写是正确的,所指的元素是不可以改变的
For(iter=vv.begin();iter!vv.end();iter++)
*iter=0; //这样写是错误的,所指的值被改变了

2、 声明const iterator时,必须初始化它。一旦被初始化后,就不能改变它的值。
const迭代器是不能改变的迭代器,是常量,其性质是由const决定的。
vector nums(10);
const vector::iterator cit=nums.begin();
*cit=1; //初始化
cit++; //错误 不能被修改
3、 iterator可以改变元素的值 其余情况同上面一样。

//关于vector的用法

#include
#include <stdio.h>
#include

using namespace std;

/*vector的用法
1、vector是表示可变大小数组的序列容器
2、采用连续存储空间来存储元素,意味着可以采用下标对vector的元素进行访问
3、使用动态分配数组来存储它的元素。当新的元素插入的时候,这个数组需要被重新分配大小。
其做法是:分配一个新的数组,然后将全部元素移动到这个数组中
*/

int main()
{
//1、初始化
vector hzy;
vector vec; //声明一个int型向量
vector ace;
//vector vec(5); //声明一个初始大小为5的向量
//vector vec(10,1); //声明一个初始大小为10且值都是1的向量

/*
2、基本操作
向量大小:vec.size()
末尾添加元素:vec.push_back();
末尾删除元素:vec.pop_back();
向量判空:vec.empty();

3、迭代器
开始指针:vec.begin();
末尾指针:vec.end(); //指向最后一个元素的下一个位置

4、元素的访问
下标访问:vec[1];//不会检查是否越界
at方法访问:vec.at(1); //at会检查是否越界,如果是就会抛出out of range
访问第一个元素:vec.front();
访问最后一个元素:vec.back();

返回一个指针:int *p=vec.data(); //可行的原因在于vector在内存中就是一个连续存储的数组,所以可以返回一个指针指向这个数组
*/

//vector<int>::iterator it;
//for (it = vec.begin(); it != vec.end();it++)
//{
//	cout << *it << endl;
//}
或者
//for (int i = 0; i < vec.size();i++)
//{
//	cout << vec.at(i) << endl;
//}
hzy.push_back(7);
hzy.push_back(9);
hzy.push_back(10);

vec.push_back(3);
vec.push_back(6);
vec.push_back(9);
vec.push_back(10);

ace.push_back(10);
ace.push_back(9);
ace.push_back(1);
ace.push_back(3);

for (int i = 0; i < hzy.size(); i++)
{
	cout << hzy.at(i) << "\t";
}
cout << endl;
for (int i = 0; i < vec.size();i++)
{
	cout << vec.at(i) <<"\t";
}
cout << endl;
for (int i = 0; i < ace.size(); i++)
{
	cout << ace.at(i) << "\t";
}
cout << endl;

int min;
int index;
min = vec.at(0) + ace.at(0);
index = 0;
for (int i = 0; i < vec.size();i++)
{
	if ((vec.at(i) + ace.at(i)) <min)
	{
		min = vec.at(i) + ace.at(i);
		index = i;
	}
}

printf("min=%d\n", min);
printf("index=%d\n", index);
printf("num=%d\n",hzy[index]);
system("pause");
return 1;	

}
/*
输出结果:
3
6
9
10
*/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值