C/C++教程

C++STL容器(三)

本文主要是介绍C++STL容器(三),对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

集合

1.数据自带排序

2.数据具有唯一性(单集合)

3.自定义类型数据需要重载<

#include <iostream>
#include <set>
#include <string>
#include <ctime>
#include <bitset>
using namespace std;
//基本操作
void testSet()
{
	srand((unsigned int)time(nullptr));//随机数种子
	set<int> setdata1;
	set<int, less<int>> setdata2;
	for (int i = 0; i < 10; i++)
	{
		setdata1.insert(rand() % 10);
	}
	for (set<int>::iterator iter = setdata1.begin(); iter != setdata1.end(); iter++)
	{
		cout << *iter << endl;
	}
}
//自定义类型操作
class Boy
{
public:
	Boy(string name, int age) :name(name), age(age){}
	bool operator<(const Boy& boy)const
	{
		return this->name < boy.name;
	}
	void print()
	{
		cout << name << "\t" << age << endl;
	}
protected:
	string name;
	int age;
};
void testusedata()
{
	set<Boy> boydata;
	boydata.insert(Boy("name1", 1));
	boydata.insert(Boy("name2", 2));
	boydata.insert(Boy("name1", 3));
	boydata.insert(Boy("name2", 4));
	for (auto v : boydata)
	{
		v.print();
	}
}
//多重集合
void testmultiset()
{
	multiset<int> muldata;
	for (int i = 0; i < 10; i++)
	{
		muldata.insert(rand() % 10);
	}
	for (auto v : muldata)
	{
		cout << v << endl;
	}
}
//bitset
void testbitset()
{
	bitset<8> bsdata(1110000);//多少个二进制位
	cout << bsdata << endl;
	cout<<bsdata.flip() << endl;//反转
}
int main()
{
	testSet();
	testusedata();
	testmultiset();
	testbitset();
	return 0;
}

映射

1.自带排序

2.数据唯一性

3.自定义数据类型重载键的符号(<)

4.多重映射,存在相同的键,不可采用下标

#include <iostream>
#include <map>
#include <string>
using namespace std;
//数对
void testpair()
{
	pair<int, string> pdata(1, "string");
	cout << pdata.first << " " << pdata.second << endl;
}
//单映射
void testmap()
{
	map<int, string> mapdata;
	//1.insert插入
	mapdata.insert(pair<int, string>(1, "string1"));
	//2.make_pair构建数对插入
	mapdata.insert(make_pair<int,string>(1,"string0"));
	//3.单映射,可以直接采用数组下标方式
	mapdata[-1] = string("string-1");
	for (map<int, string>::iterator iter = mapdata.begin(); iter != mapdata.end(); iter++)
	{
		//相同的键采用覆盖的方式
		cout << iter->first << "\t" << iter->second << endl;//-1 string-1     1 string1先插后出
	}
	//删除(删除键值)
	mapdata.erase(1);
}
class A
{
public:
	A() = default;
	A(string name, int age) :name(name), age(age){}
	bool operator<(const A& a)const
	{
		return this->name < a.name;
	}
	void print()const
	{
		cout << name << "\t" << age << endl;
	}
protected:
	string name;
	int age;
};
class B
{
public:
	B(string name, int age) :name(name), age(age){}
	B() = default;
	void print()const
	{
		cout << name << "\t" << age << endl;
	}
protected:
	string name;
	int age;
};
//自定义类型
void testclass()
{
	map<A, B> mapclass;
	mapclass[A("classA1", 1)] = B("classB1", 1);
	mapclass[A("classA1", 1)].print();
	mapclass[A("classA2", 2)] = B("classB2", 2);
	for (auto v : mapclass)
	{
		v.first.print();
		v.second.print();
	}
}
//多重映射
void testmultimap()
{
	multimap<int, string> muldata;
	muldata.insert(pair<int, string>(1, "string1"));
	muldata.insert(pair<int, string>(1, "string2"));
	muldata.insert(pair<int, string>(2, "string1"));
	muldata.insert(pair<int, string>(2, "string2"));
	muldata.insert(pair<int, string>(3, "string1"));
	for (auto v : muldata)
	{
		cout << v.first << "\t" << v.second << endl;
	}
}
int main()
{
	testmap();
	testclass();
	testmultimap();
	return 0;
}

列表

#include <iostream>
#include <array>
#include <vector>
#include <list>
#include <initializer_list>
using namespace std;
class A
{
public:
	A(int a1, int a2, int a3, int a4) :a1(a1), a2(a2), a3(a3), a4(a4){}
	A(const initializer_list<int> inilist)
	{
		for (auto iter = inilist.begin(); iter != inilist.end(); iter++)
		{
			cout << *iter << "\t";
		}
		cout << endl;
	}
protected:
	int a1;
	int a2;
	int a3;
	int a4;
};
void print(const initializer_list<int> inilist)
{
	for (auto iter = inilist.begin(); iter != inilist.end(); iter++)
	{
		cout << *iter << "\t";
	}
	cout << endl;
}
int main()
{
	array<int, 3> arrdata = { 1, 2, 3 };
	vector<int> vecdata = { 1, 2, 3, 4, 5, 6 };
	A a = { 1, 2, 3, 4 };
	A b = { 1, 2, 3 };
	print({ 1, 2, 3, 4, 5 });
	return 0;
}

元组

1.整合数据为一组

#include <iostream>
#include <tuple>
#include <string>
using namespace std;
//元组
int main()
{
	//初始化
	tuple<string, int, int, string> boy = make_tuple("name", 1, 1, "111");
	tuple<string, string> name = forward_as_tuple("name1", "name2");
	tuple<string, int, int, string> boy1[2];
	//查看
	//1.get 不可用for
	cout << get<0>(boy) << "\t";
	cout << get<1>(boy) << "\t";
	cout << get<2>(boy) << "\t";
	cout << get<3>(boy) << "\t" << endl;
	//2.tie
	string boyname;
	int age;
	int num;
	string tel;
	tie(boyname, age, num, tel) = boy;
	cout << boyname << "\t" << age << "\t" << num << "\t" << tel << endl;
	//链接
	auto result = tuple_cat(boy, name);
	return 0;
}

这篇关于C++STL容器(三)的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!