大白糖奶兔的Blog
大白糖奶兔的Blog
STL-容器

定义了函数调用操作符的对象,又称仿函数。

使一个类的使用看上去像一个函数,其实现就是类中实现一个operator()

这个类就有了类似函数的行为

#include<iostream>
#include<string>
using namespace std;
class X {
public:
	void operator()(string str) {
		cout << "执行X函数" << str << endl;
		//定义了操作符(),所以调用起来形式上和函数无异;
	}
};
int main() {
	X test;
	test("Hello");
	return 0;
}

内置函数对象

#include<iostream>
#include<string>
#include<functional>
using namespace std;
class X {
public:
	void operator()(string str) {
		cout << "执行X函数" << str << endl;
		//定义了操作符(),所以调用起来形式上和函数无异;
	}
};
int main() {
	X test;
	test("Hello");
	int x = multiplies<int>()(4, 5);//相当于x=4*5
	cout << x;
	//内置函数对象
	return 0;
}

模板

模板就是以数据类型作为参数的程序设计

种类

  • 函数模板
  • 类模板
  • 模板特化

1、函数模板

格式

template<模板类型参数列表>函数声明(定义)
#include<iostream>
#include<string>
#include<functional>
using namespace std;
template<class T>//T指代任何一个类型
void swap(T& a, T& b) {
	T tmp = a;
	a = b;
	b = tmp;
}
int main() {
	int a = 3, b = 5;
	float fa = 3.01, fb = 5.02;

	//函数模板调用
	swap(a, b);
	swap(fa, fb);

	//内置函数对象
	return 0;
}

类模板

格式

template<模板类型参数列表>类模板的声明(定义)
//使用时不能进行参数类型推导,在类模板实例化的时候必须显式指明类型参数
#include<iostream>
#include<string>
#include<functional>
using namespace std;
//函数模板
template<class T>//T指代任何一个类型
void swap(T& a, T& b) {
	T tmp = a;
	a = b;
	b = tmp;
}
template<class T>
class vector {
	//向量模板类
	T* v;
	int sz;
//public:
	//vector(int s) { v = new T[sz = s]; } - vector() { delete[] v; }
}	//......
};


//类模板

class X {
public:
	void operator()(string str) {
		cout << "执行X函数" << str << endl;
		//定义了操作符(),所以调用起来形式上和函数无异;
	}
};
int main() {
	int a = 3, b = 5;
	float fa = 3.01, fb = 5.02;

	//函数模板调用
	swap(a, b);
	swap(fa, fb);

	//内置函数对象
	return 0;

	//vecto实例化
	vector<int> int_vector(10);
	vector<char> char_vector(10);
	//自定义类型vector<shape> shape_vector(10);
	

}

容器

顺序容器

  • 向量Vector
#include<vector>
#include<iostream>
using namespace std;
int main() {
	vector<int> v_int;
	for (int i = 0; i < 5; i++)
	{
		v_int.push_back(i);//向容器中插入数据
		cout << v_int[i] << " " << endl;
	}
	for (int i = 0; i < 5; i++)
	{
		v_int.pop_back();//删除容器中的数据
	}
	for (int i = 0; i < v_int.size(); i++)
		//以容器的实际大小进行循环
	{
		cout << v_int[i];
	}
	return 0;
}
https://yczbest.cn/wp-content/uploads/2020/10/image.png
  • 双向队列Deque
  • 线性表List

关联容器

集合

#include<set>
#include<iostream>
#include<string>
#include<iterator>
using namespace std;

class Person {
	//友元函数,重载输出自定义类型对象
	friend ostream& operator << (ostream& out, const Person& person);
public:
	Person(string name, int age) {
	mName = name;
	mAge = age;
}
public:
	string mName;
	int mAge;
};
ostream &operator << (ostream& out, Person& person) {
	out << "name:" << person.mName << "\t" << person.mAge << endl;
	return out;
}
class ComparePerson {
public:
	bool operator()(const Person& p1, const Person& p2) {
		if (p1.mName == p2.mName)
			return (p1.mAge > p2.mAge);
		return (p1.mName > p2.mName);
	}
};
//打印Set类型的函数模板
template<typename T>
void PrintSet(T& s) {
	//迭代器
	for (T::iterator iter = s.begin(); iter < s.end(); ++iter)
	{
		cout << *iter << " ";
	}
		
	cout << endl;
}
int main() {
	set<Person, ComparePerson> s;
	//ComparePerson用于比较自定义类型的大小,否则无法通过编译
	s.insert(Person("小智1", 11));
	s.insert(Person("小智2", 22));
	PrintSet(s);
	return 0;
}
  • 多重集合(MultiSet)
  • 映射(Map)
  • 多重映射(MultiMap)

发表评论

textsms
account_circle
email

大白糖奶兔的Blog

STL-容器
定义了函数调用操作符的对象,又称仿函数。 使一个类的使用看上去像一个函数,其实现就是类中实现一个operator() 这个类就有了类似函数的行为 #include<iostream> #include…
扫描二维码继续阅读
2020-10-14
Title - Artist
0:00