语法:
#写法一: template<typename T> 函数声明或定义 #写法二: template<class T> 函数声明或定义 # template: 声明创建模板 # typename / class 表明其后面的符号T 是一种通用的数据类型 # T 通用数据类型,名称可以替换,通常为大写字母
//交换整型函数 void swapInt(int& a, int& b) { int temp = a; a = b; b = temp; } //交换浮点型函数 void swapDouble(double& a, double& b) { double temp = a; a = b; b = temp; } //利用模板提供通用的交换函数 template<typename T> void mySwap(T& a, T& b) { T temp = a; a = b; b = temp; } void test01() { int a = 10; int b = 20; //swapInt(a, b); //利用模板实现交换 //1、自动类型推导 mySwap(a, b); //2、显示指定类型 mySwap<int>(a, b); cout << "a = " << a << endl; cout << "b = " << b << endl; } int main() { test01(); system("pause"); return 0; }
#include <iostream> using namespace std; //利用模板提供通用的交换函数 template<class T> void mySwap(T &a, T &b) { T temp = a; a = b; b = temp; } // 1、自动类型推导,必须导出一致的数据类型T,才可以使用 void test01() { int a = 10; int b = 20; char c = 'c'; mySwap(a, b); // 正确, a和b的类型一致,可以自动推导 //mySwap(a, c); // 错误,int 和 char 类型不一致,不能推导出一直的T类型 } // 2、模板必须要确定出T的类型才能够使用 template <class T> void func() { cout << "func 调用!" << endl; } void test02() { //func(); // 报错,显示必须要确定T的类型才能使用,尽管现在 没有使用T。 func<int>(); // 利用显示指定类型的方式,给定T的类型后才可以使用模板。 } int main() { test02(); system("pause"); return 0; }
#include <iostream> using namespace std; // 交换的模板 template<class T> void mySwap(T &a, T &b) { T temp = a; a = b; b = temp; } template<class T> void mysort(T arr[], int len) { for (T i = 0; i < len; i++) { for (T j = i + 1; j < len; j++) { T max = i; if (arr[max] < arr[j]) { mySwap(arr[max], arr[j]); } } } } // template<class T> void PrintArray(T arr[], int len) { for (T i = 0; i < len; i++) { cout << arr[i] << " "; } cout << endl; } void test01() { // 测试int数组 int intArr[] = { 7,5,8,1,3,9,2,4,6 }; int num = sizeof(intArr) / sizeof(int); mysort(intArr, num); PrintArray(intArr, num); } void test02() { // 测试int数组 char charArr[] = "bdhnsyg"; int num = sizeof(charArr) / sizeof(char); mysort(charArr, num); PrintArray(charArr, num); } int main() { //test01(); test02(); system("pause"); return 0; }
#include <iostream> using namespace std; //普通函数 int myAdd01(int a, int b) { return a + b; } // 函数模板 template<class T> T myAdd02(T a, T b) { return a + b; } // 使用函数模板时,如果利用自动类型推导,不会发生自动类型转换,即隐式类型转换 void test01() { int a = 10; int b = 20; char c = 'c'; cout << myAdd01(a, c) << endl; // 正确,将char类型的c 隐式转换成int; //cout << myAdd02(a, c) << endl; // 错误,编译器提示,没有与参数列表匹配的函数模板,myadd02(int,char) cout << myAdd02<int>(a, c) << endl; //正确,如果使用显示指定类型,可以发生隐式类型转换 cout << myAdd02<char>(a, c) << endl; //输出是m } int main() { test01(); system("pause"); return 0; }
#include<iostream> using namespace std; void myPrint(int a, int b) { cout << "调用的普通函数" << endl; } template<class T> void myPrint(T a, T b) { cout << "调用的模板函数" << endl; } template<class T> void myPrint(T a, T b, T c) { cout << "调用的重载的模板函数" << endl; } void test01() { // 1、如果函数模板和普通函数都可以实现,优先调用普通函数 // 注意:如果告诉编译器 普通函数有,但是只有声明没有实现,或者不在当前文件内实现,就会报错找不到。 int a = 10; int b = 20; myPrint(a, b); //函数模板和普通函数都可以实现,优先调用普通函数。 // 2、可以通过空模板参数列表来强制调用函数模板 myPrint<>(a, b); // 调用模板函数 // 3、函数模板也可以发生重载 int c = 30; myPrint(a, b, c); // 4、如果函数模板可以产生更好的匹配,优先调用函数模板 char c1 = 'b'; char c2 = 'c'; myPrint(c1, c2); // 调用函数模板 } int main() { test01(); system("pause"); return 0; }
template<class T> void f(T a, T b){ a = b; }
上述代码中提供的赋值操作,如果传入的a和b是一个数组,就无法实现。
template<class T> void f(T a, T b){ if(a>b){....} ; }
#include<iostream> using namespace std; #include <string> class Person { public: Person(string name, int age) { this->m_Name = name; this->m_Age = age; } string m_Name; int m_Age; }; template<class T> bool myCompare(T &a, T &b) { if (a == b) { return true; } else { return false; } } // 具体化 以template<>开头 和 显示具体化的原型 ,并通过名称来指出类型 // 具体化优先于常规模板 template<> bool myCompare(Person &p1, Person &p2) { // 这里的 template<> 是告诉编译器这个 是 模板的 重载 if (p1.m_Name == p2.m_Name && p1.m_Age == p2.m_Age) { return true; } else { return false; } } void test01() { int a = 10; int b = 20; // 内置数据类型可以直接使用通用的函数模板 bool ret = myCompare(a, b); if (ret) { cout << "a = b" << endl; } else { cout << "a != b" << endl; } } void test02() { Person p1("Tom", 10); Person p2("Tom", 20); // 自定义数据类型,不会调用普通的函数模板 // 可以创建具体化的Person数据类型的模板,用于特殊处理这个类型 bool ret = myCompare(p1, p2); if (ret) { cout << "p1 = p2" << endl; } else { cout << "p1 != p2" << endl; } } int main() { test01(); test02(); system("pause"); return 0; }
template <class T> 类
#include<iostream> using namespace std; #include <string> template<class NameType, class AgeType> class Person { public: Person(NameType name, AgeType age) { this->m_Name = name; this->m_Age = age; } void ShowPerson() { cout << "name: " << this->m_Name << " age: " << this->m_Age << endl; } NameType m_Name; AgeType m_Age; }; void test01() { Person<string,int> p1("孙悟空",999); Person<string,int> p2("猪八戒", 999); p1.ShowPerson(); } int main() { test01(); system("pause"); return 0; }
#include<iostream> using namespace std; #include<string> //类模板 template<class NameType, class AgeType = int> class Person { public: Person(NameType name, AgeType age) { this->m_Name = name; this->m_Age = age; } void showPerson() { cout << "name: " << this->m_Name << " age: " << this->m_Age << endl; } NameType m_Name; AgeType m_Age; }; void test01() { Person<string, int> p1("孙悟空", 1000); // 类模板使用时候,不可以使用自动类型推导,必须使用显示指定类型的方式,使用类模板。 p1.showPerson(); } void test02() { Person<string> p2("猪八戒", 999); // 类模板中的模板参数列表 可以指定默认参数 p2.showPerson(); } int main() { test02(); system("pause"); return 0; }
#include<iostream> using namespace std; #include<string> class Person1 { public: void showPerson1() { cout << "Person1 show" << endl; } }; class Person2 { public: void showPerson2() { cout << "Person2 show" << endl; } }; template<class T> class MyClass { public: T obj; //类模板中的成员函数,并不是一开始就创建的,而是在模板调用时在生成 void func1() { obj.showPerson1();} void func2() { obj.showPerson2();} }; void test01() { MyClass<Person1> p; p.func1(); // 出错的原因,一开始 T obj类型无法确定,只有在创建类模板的时候才能确定他的数据类型,以及他的内部有没有这个函数。 //p.func2(); // 编译错误,说明函数调用才会去创建成员函数 } int main() { test01(); system("pause"); return 0; }
#include<iostream> using namespace std; #include<string> template<class NameType, class AgeType = int> class Person { public: Person(NameType name, AgeType age) { this->m_Name = name; this->m_Age = age; } void ShowPerson() { cout << "Name: " << this->m_Name << " Age: " << this->m_Age << endl; } NameType m_Name; AgeType m_Age; }; // 1、直接指定传入的类型 void printPerson1(Person<string, int> &p) { p.ShowPerson(); } void test01() { Person<string> p1("孙悟空",999); printPerson1(p1); } // 2、参数模板化 template<class T1,class T2> void printPerson2(Person<T1, T2> &p) { p.ShowPerson(); cout << "T1的类型为:" << typeid(T1).name() << endl; cout << "T2的类型为:" << typeid(T2).name() << endl; } void test02() { Person<string, int> p2("猪八戒", 99); printPerson1(p2); } // 3、整个类模板化 template<class T> void printPerson3(T &p) { cout << "T的类型为:" << typeid(T).name() << endl; p.showPerson(); } void test03() { Person<string, int> p3("唐僧", 39); printPerson1(p3); } int main() { test01(); test02(); test03(); system("pause"); return 0; }
#include<iostream> using namespace std; #include<string> template<class T> class Base { T m; }; //class son : public Base{}; //错误,c++编译器需要给子类分配内存,必须知道父类中T的类型才可以向下继承 class Son: public Base<int>{}; void test01() { Son c; } // 如果父类是类模板,子类需要指定出父类中的T的数据类型。 // 类模板继承类模板,可以用T2指定父类中的T类型 template<class T1, class T2> class Son2 :public Base<T2> { public: Son2() { cout << typeid(T1).name() << endl; cout << typeid(T2).name() << endl; } }; void test02() { Son2<int, char> child1; } int main() { test01(); test02(); system("pause"); return 0; }
#include<iostream> using namespace std; #include<string> // 类模板中成员函数类外实现 template<class T1,class T2> class Person { public: //成员函数类内声明 Person(T1 name, T2 age); void showPerson(); public: T1 m_Name; T2 m_Age; }; // 构造函数 类外实现 template<class T1,class T2> // 普通的成员函数类外实现是 作用域Person::Person(T1 name,T2 age), // 但是这里的T1和T2不知道 所以我们要加上 上面的template<class T1,class T2>。 // 此外我们这里实现的是 类模板的 类外实现,我们还需要在作用域上也加T1,T2 Person<T1, T2>::Person(T1 name, T2 age),告诉编译器这个是类模板 Person<T1, T2>::Person(T1 name, T2 age) { this->m_Name = name; this->m_Age = age; } // 成员函数类外实现 // 构造函数 类外实现 template<class T1, class T2> void Person<T1, T2>::showPerson() { cout << "姓名:" << this->m_Name << " 年龄:" << this->m_Age << endl; } void test01() { Person<string, int> p1("Tom", 20); p1.showPerson(); } int main() { test01(); system("pause"); return 0; }
person.hpp中的代码
#pragma once #include<iostream> using namespace std; #include<string> template<class T1,class T2> class Person { public: Person(T1 name, T2 age); void showPerson(); public: T1 m_Name; T2 m_Age; }; // 构造函数 类外实现 template<class T1, class T2> Person<T1, T2>::Person(T1 name,T2 age) { this->m_Name = name; this->m_Age = age; } // 构造函数 类外实现 template<class T1, class T2> void Person<T1, T2>::showPerson() { cout << "姓名:" << this->m_Name << " 年龄:" << this->m_Age << endl; }
类模板分文件编写.cpp中代码
#include<iostream> using namespace std; #include<string> // 解决方案 将声明和实现写到一起,文件后缀名改为 .hpp #include"person.hpp" void test01() { Person<string, int> p("Tom", 30); p.showPerson(); } int main() { test01(); system("pause"); return 0; }
#include<iostream> using namespace std; #include<string> // 2、全局函数配合友元 类外实现 // 2.2 提前让编译器知道Person类模板的存在 template<class T1, class T2> class Person; // 2.1.1 最简单的方法就是将这个函数实现写到最前面,让编译器知道这个函数的存在 // 2.1.2 同时这里有一个Person的类模板,需要让编译器提前知道这个类模板的存在 template<class T1, class T2> void printPerson2(Person<T1, T2> &p) { cout << "姓名:" << p.m_Name << " 年龄:" << p.m_Age << endl; } template<class T1, class T2> class Person { // 1、全局函数配合友元 类内实现 friend void printPerson1(Person<T1, T2> &p) // 全局函数,类模板做函数参数1 直接指定数据类型 { cout << "姓名:" << p.m_Name << " 年龄:" << p.m_Age << endl; } // 2、全局函数配合友元 类外实现 // 这个友元函数声明是一个普通函数,而下面函数的实现是 一个 模板函数,不一致,所以这里要加一个空模板参数列表 // 如果全局函数是 类外实现,需要让编译器提前知道这个函数的存在 friend void printPerson2<>(Person<T1, T2> &p); public: Person(T1 name, T2 age) { this->m_Name = name; this->m_Age = age; } private: T1 m_Name; T2 m_Age; }; void test01() { Person<string, int> p1("Tom", 30); printPerson1(p1); } void test02() { Person<string, int> p2("Jerry", 30); printPerson1(p2); } int main() { test01(); test02(); system("pause"); return 0; }
STL大体分为六大组件,分别是:容器、算法、迭代器、仿函数、适配器(配接器)、空间配置器。
种类 | 功能 | 支持运算 |
---|---|---|
输入迭代器 | 对数据的只读访问 | 只读、支持++、==、!= |
前向迭代器 | 读写操作、并能向前推进迭代器 | 读写、支持++、==、!= |
双向迭代器 | 读写操作、并能向前和向后操作 | 只读、支持++、- |
随机访问迭代器 | 读写操作、可以以跳跃的方式访问任意数据,功能最强的迭代器 | 读写、支持++、-、[n]、-n、<、<=、>、>= |
STL中最常用的容器是Vector,可以理解为数组,下面我们将学习如何向这个容器中插入数据、并遍历整个容器。
容器:vector
算法: for_each
迭代器:vector::iterator
#include<iostream> using namespace std; #include<vector> #include<algorithm> void myprint(int val) { cout << val << endl; } void test01() { // 创建vector容器对象,并且通过模板参数指定容器中存放的数据类型 vector<int> v; // 向容器中存放数据 v.push_back(10); v.push_back(20); v.push_back(30); v.push_back(40); v.push_back(50); // 每一个容器中都有自己的迭代器,迭代器是用来遍历容器中的元素。 // v.begin() 返回迭代器,这个迭代器指向容器中的第一个元素。 // v.end() 返回迭代器,这个迭代器指向容器元素的最后一个元素的下一个位置。 // vector<int>::iterator 拿到vector<int>这个容器的迭代器类型。 vector<int>::iterator pBegin = v.begin(); vector<int>::iterator pEnd = v.end(); // 第一种遍历方式 while (pBegin != pEnd) { cout << *pBegin << endl; pBegin++; } // 第二种遍历方式 for (vector<int>::iterator it = v.begin(); it != v.end(); it++) { cout << *it << endl; } // 第三种遍历方式 // 利用STL提供的标准遍历算法, 需要包含头文件 algorithm for_each(v.begin(), v.end(),myprint); //myprint 回调函数,一开始不调用,for_each遍历期间在调用 } int main() { test01(); system("pause"); return 0; }
#include<iostream> using namespace std; #include<vector> #include<string> // 自定义数据类型 class Person { public: Person(string name, int age) { this->m_Name = name; this->m_Age = age; } public: string m_Name; int m_Age; }; // 存放对象 void test01() { vector<Person> v; // 创建数据 Person p1("aaa", 10); Person p2("bbb", 20); Person p3("ccc", 30); Person p4("ddd", 40); Person p5("eee", 50); v.push_back(p1); v.push_back(p2); v.push_back(p3); v.push_back(p4); v.push_back(p5); // vector<Person>::iterator 中<>是什么类型,*it就是什么类型, // 其中,it可以看成是一个指针 for (vector<Person>::iterator it = v.begin(); it != v.end(); it++) { // *it是Person类型,Person.name获取name的属性。 cout << "姓名:" << (*it).m_Name << "年龄为:" << (*it).m_Age << endl; } } // 存放对象指针 void test02() { vector<Person*> v; // 即 vector中存放的是自定义数据类型的地址。 // 创建数据 // 创建数据 Person p1("aaa", 10); Person p2("bbb", 20); Person p3("ccc", 30); Person p4("ddd", 40); Person p5("eee", 50); // vector中存放的是自定义数据类型的地址,所以应该 使用 引用的方式 存入数据的地址。 v.push_back(&p1); v.push_back(&p2); v.push_back(&p3); v.push_back(&p4); v.push_back(&p5); // vector<Person *>::iterator 中<>是什么类型,*it就是什么类型, // 即 *it 是Person类型的指针,通过 -> 导出属性 for (vector<Person*>::iterator it = v.begin(); it != v.end(); it++) { Person * p = (*it); cout << "姓名:" << p->m_Name << "年龄为:" << p->m_Age << endl; } } int main() { test01(); test02(); system("pause"); return 0; }
#include<iostream> using namespace std; # include<vector> void test01() { vector<int> v1; vector<int> v2; vector<int> v3; vector<int> v4; vector<int> v5; for (int i = 0; i < 4; i++) { v1.push_back(i+1); v2.push_back(i+2); v3.push_back(i+3); v4.push_back(i+4); v5.push_back(i+5); } vector<vector<int>> v; v.push_back(v1); v.push_back(v2); v.push_back(v3); v.push_back(v4); v.push_back(v5); for (vector < vector<int>>::iterator it = v.begin(); it != v.end(); it++) { for (vector<int>::iterator vit = (*it).begin(); vit != (*it).end(); vit++) { cout << *vit << " "; } cout << endl; } } int main() { test01(); system("pause"); return 0; }
#include<iostream> using namespace std; #include<string> void test01() { string s1; //创建空字符串,调用无参构造函数 cout << "s1 = " << s1 << endl; const char* str = "hello world"; string s2(str); // 把c类型的字符串转换成 string cout << "s2 = " << s2 << endl; string s3(s2); //调用拷贝构造函数 cout << "s3 = " << s3 << endl; string s4(10,'a'); cout << "s43 = " << s4 << endl; } int main() { test01(); system("pause"); return 0; }
#include<iostream> using namespace std; #include<string> void test01() { string str1; str1 = "hello world"; cout << "str1 = " << str1 << endl; string str2; str2 = str1; cout << "str2 = " << str2 << endl; string str3; str3 = 'a'; cout << "str3 = " << str3 << endl; string str4; str4.assign("hello world"); cout << "str4 = " << str4 << endl; string str5; str5.assign("hello world",4); cout << "str5 = " << str5 << endl; string str6; str6.assign(str5); cout << "str6 = " << str6 << endl; string str7; str7.assign(5,'x'); cout << "str7 = " << str7 << endl; } int main() { test01(); system("pause"); return 0; }
#include<iostream> using namespace std; #include<string> void test01() { string str1 = "我"; str1 += " 爱玩游戏"; cout << "str1 = " << str1 << endl; str1 += ":"; cout << "str1 = " << str1 << endl; string str2 = " LOL DNF" ; str1 += str2; // str1的后面加上str2 cout << "str1 = " << str1 << endl; string str3 = "I"; str3.append(" love"); str3.append(" game abcded", 4); str3.append(str2, 4, 4);//从下标4位置开始,截取4个字符,拼接到字符串末尾 cout << "str3 = " << str3 << endl; } int main() { test01(); system("pause"); return 0; }
#include<iostream> using namespace std; #include<string> void test01() { //查找 string str1 = "abcdefgde"; int pos = str1.find("de"); if (pos == -1) { cout << "未找到!" << endl; } else { cout << "pos = " << pos << endl; //de第一次出现的位置是3,pos返回3 } } void test02() { // 替换 string str1 = "abcdefgde"; str1.replace(1, 3, "1111"); //从第一个位置开始,到第三个位置的字符bcd替换成1111, cout << "str1 = " << str1 << endl; } int main() { test01(); test02(); system("pause"); return 0; }
#include<iostream> using namespace std; #include<string> void test01() { string s1 = "hello"; string s2 = "ahello"; int ret = s1.compare(s2); if (ret == 0) { cout << "s1 = s2" << endl; } else if(ret == -1) { cout << "s1 < s2" << endl; } else { cout << "s1 > s2" << endl; } } int main() { test01(); system("pause"); return 0; }
#include<iostream> using namespace std; #include<string> void test01() { string str = "hello world"; for (int i = 0; i < str.size(); i++) { cout << str[i] << " "; } cout << endl; for (int i = 0; i < str.size(); i++) { cout << str.at(i)<< " "; } cout << endl; // 字符修改 str[0] = 'x'; str.at(1) = 'x'; cout << "str = " << str << endl; } int main() { test01(); system("pause"); return 0; }
#include<iostream> using namespace std; #include<string> void test01() { string str1 = "hello"; str1.insert(1, "11"); // 在pos位置插入字符串 cout << "str1 = " << str1 << endl; str1.insert(1, 3, 'a'); // 在pos位置插入n个字符 cout << "str1 = " << str1 << endl; str1.erase(1, 2); // 删除从1开始的两个字符 cout << "str1 = " << str1 << endl; } int main() { test01(); system("pause"); return 0; }
#include<iostream> using namespace std; #include<string> void test01() { string str1 = "abcdefg"; string substr = str1.substr(1, 3); //获取指定取件的字符 cout << "substr = " << substr << endl; string email = "hello@sina.com"; int pos = email.find("@"); string username = email.substr(0, pos); cout << "username = " << username << endl; } int main() { test01(); system("pause"); return 0; }
#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> v; //无参构造 for (int i = 0; i < 10; i++) { v.push_back(i); } printVector(v); vector<int> v2(v.begin(), v.end()); // 将区间内的元素拷贝给本身 printVector(v2); vector<int> v3(10,100); // 构造函数将n个elem拷贝给本身 printVector(v3); vector<int> v4(v3); //拷贝构造函数 printVector(v4); } int main() { test01(); system("pause"); return 0; }
#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> v; //无参构造 for (int i = 0; i < 10; i++) { v.push_back(i); } printVector(v); vector<int> v2; v2 = v; // 等号重载 printVector(v2); vector<int> v3; v3.assign(v.begin(), v.end()); // 将区间内的元素拷贝给本身 printVector(v3); vector<int> v4; v4.assign(10, 100); // 构造函数将n个elem拷贝给本身 printVector(v4); } int main() { test01(); system("pause"); return 0; }
#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> v; //无参构造 for (int i = 0; i < 10; i++) { v.push_back(i); } printVector(v); if (v.empty()) { cout << "v为空!" << endl; } else { cout << "v不为空!" << endl; cout << "v的容量为:" << v.capacity() << endl; cout<< "v的大小为:" << v.size() << endl; } // resize重新指定大小,若指定的更大,默认用0填充新位置,可以利用重载版本更改默认填充 v.resize(15, 10); printVector(v); // resize重新指定大小,若指定的更小,超过的部分被删除。 v.resize(5); printVector(v); } int main() { test01(); system("pause"); return 0; }
#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> v; //无参构造 for (int i = 0; i < 10; i++) { // 尾插 v.push_back(i); } printVector(v); // 尾删 v.pop_back(); printVector(v); // 插入 v.insert(v.begin(), 100); printVector(v); v.insert(v.begin(),2, 10); 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; }
#include<iostream> using namespace std; #include<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; for (int i = 0; i < v.size(); i++) { cout << v.at(i) << " "; } cout << endl; cout << "v的第一个元素为:"<<v.front()<<endl; cout << "v的最后一个元素为:" << v.back() << endl; } int main() { test01(); system("pause"); return 0; }
#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> v; //无参构造 for (int i = 0; i < 10; i++) { // 尾插 v.push_back(i); } printVector(v); vector<int> v2; //无参构造 for (int i = 10; i > 0; i--) { // 尾插 v2.push_back(i); } printVector(v2); // 互换容器 cout << "互换后" << endl; v.swap(v2); printVector(v); printVector(v2); } void test02() { vector<int> v; //无参构造 for (int i = 0; i < 10000; i++) { // 尾插 v.push_back(i); } //printVector(v); cout << "v的容量为: " << v.capacity() << endl; cout << "v的大小为: " << v.size() << endl; v.resize(3); //重新指定大小 // 虽然现在重新指定大小后只有3个,但是之前分配的容量没有改变,还和上面的一样。 cout << "v的容量为: " << v.capacity() << endl; cout << "v的大小为: " << v.size() << endl; // 收缩内存 // Vector<int>(v):匿名对象,调用拷贝构造函数,利用v创建了一个新的对象 vector<int>(v).swap(v); cout << "v的容量为: " << v.capacity() << endl; cout << "v的大小为: " << v.size() << endl; } int main() { test01(); test02(); system("pause"); return 0; }
#include<iostream> using namespace std; #include<vector> void test01() { vector<int> v; //无参构造 // 预留空间 v.reserve(100000); int num = 0; int *p = NULL; for (int i = 0; i < 100000; i++) { v.push_back(i); if (p != &v[0]) { // vector如果内存不够,会重新分配内存,这里看分配了多少次 // 即 如果p的地址不等于vector的首地址,就让他们强制相等,从而判断到底分配了多少次内存 p = &v[0]; num++; } } cout << "num = " << num << endl; } int main() { test01(); system("pause"); return 0; }
#include<iostream> using namespace std; #include<deque> void printDeque(deque<int>& d) { for (deque<int>::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); deque<int>d2(d1.begin(), d1.end()); // 构造函数将区间内的元素拷贝给本身。 printDeque(d2); deque<int>d3(10, 100); // 构造函数将n个元素拷贝给本身。 printDeque(d3); deque<int>d4 = d3; printDeque(d4); } int main() { test01(); system("pause"); return 0; }
#include<iostream> using namespace std; #include<deque> void printDeque(deque<int>& d) { for (deque<int>::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); deque<int>d2; d2 = d1; printDeque(d2); deque<int>d3; d3.assign(d2.begin(),d2.end()); printDeque(d3); deque<int>d4; d4.assign(10, 100); printDeque(d4); } int main() { test01(); system("pause"); return 0; }
#include<iostream> using namespace std; #include<deque> void printDeque(deque<int>& d) { for (deque<int>::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大小为:" << d1.size()<< endl; } // 重新指定大小 d1.resize(15, 1); printDeque(d1); d1.resize(25); printDeque(d1); } int main() { test01(); system("pause"); return 0; }
#include<iostream> using namespace std; #include<deque> void printDeque(deque<int>& d) { for (deque<int>::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大小为:" << d1.size() << endl; } // 重新指定大小 d1.resize(15, 1); printDeque(d1); d1.resize(25); printDeque(d1); } int main() { test01(); system("pause"); return 0; }
#include<iostream> using namespace std; #include<deque> void printDeque(deque<int>& d) { for (deque<int>::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(10); d1.push_front(20); for (int i = 0; i < d1.size(); i++) { cout << d1[i] << " "; } cout << endl; for (int i = 0; i < d1.size(); i++) { cout << d1.at(i) << " "; } cout << endl; cout << "front: " << d1.front() << endl; cout << "back: " << d1.back() << endl; } int main() { test01(); system("pause"); return 0; }
#include<iostream> using namespace std; #include<deque> #include<algorithm> void printDeque(deque<int>& d) { for (deque<int>::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(10); d1.push_front(20); printDeque(d1); sort(d1.begin(), d1.end()); printDeque(d1); } int main() { test01(); system("pause"); return 0; }
有5名选手:选手ABCDE,10个评委分别对每一名选手打分,去除最高分,去除评委中最低分,取平均分。
#include<iostream> using namespace std; #include<deque> #include<algorithm> #include<string> #include<vector> #include<time.h> class Person { public: Person(string name, int age) { this->m_Name = name; this->m_Score = age; } public: string m_Name; int m_Score; }; void creatPerson(vector<Person>& v) { string nameSeed = "ABCDE"; for (int i = 0; i < 5; i++) { string name = "选手"; name += nameSeed[i]; int score = 0; Person p(name, score); // 将创建的person对象 放入容器中 v.push_back(p); } } //打分 void setScore(vector<Person>& v) { for (vector<Person>::iterator it = v.begin(); it != v.end(); it++) { // 将评委的分数 放到deque容器中 deque<int>d; for (int i = 0; i < 10; i++) { int score = rand() % 41 + 60;//0-40的随机数+60 == 60-100 d.push_back(score); } cout << "选手:" << it->m_Name << "打分:" << endl; for (deque<int>::iterator dit = d.begin(); dit < d.end(); dit++) { cout << *dit << " "; //dit 相当于一个指针,<>中的类型是什么,*dit就是什么 } cout << endl; // 排序 sort(d.begin(), d.end()); // 去掉最高和最低分 d.pop_back(); d.pop_front(); //取平均分 int sum = 0; for (deque<int>::iterator dit = d.begin(); dit < d.end(); dit++) { sum += *dit; } int avg = sum / d.size(); //将平均分赋值给选手身上 it->m_Score = avg; } } void showPerson(vector<Person>& v) { for (vector<Person>::iterator it = v.begin(); it != v.end(); it++) { cout << "姓名:" << it->m_Name << "平均分:" << it->m_Score << endl; } } int main() { // 随机数种子 srand((unsigned int)time(NULL)); // 1、创建5名选手 vector<Person>v; // 存放选手容器 creatPerson(v); // 2、测试 for (vector<Person>::iterator it = v.begin(); it != v.end(); it++) { cout << "姓名:" << (*it).m_Name << "分数:" << (*it).m_Score << endl; } // 3、给5名选手打分 setScore(v); // 4、显示最后得分 showPerson(v); system("pause"); return 0; }
#include<iostream> using namespace std; #include<stack> void printDeque(deque<int>& d) { for (deque<int>::iterator it = d.begin(); it != d.end(); it++) { cout << *it << " "; } cout << endl; } void test01() { stack<int> s; //无参构造函数 // 向栈中添加元素,叫做 压栈 入栈 s.push(10); s.push(20); s.push(30); while (!s.empty()) { // 输出栈顶元素 cout << "栈顶元素为:" << s.top() << endl; // 弹出栈顶元素 s.pop(); } cout << "栈的大小为:" << s.size() << endl; } int main() { test01(); system("pause"); return 0; }
#include<iostream> using namespace std; #include<queue> #include<string> class Person { public: Person(string name, int age) { this->m_Name = name; this->m_Age = age; } public: string m_Name; int m_Age; }; void test01() { queue<Person> q; //准备数据 Person p1("唐僧", 30); Person p2("孙悟空", 30); Person p3("猪八戒", 900); Person p4("沙僧",800); //向队列中添加数据 入队操作 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; cout << endl; // 弹出队头元素 q.pop(); } cout << "队列大小为:" << q.size() << endl; } int main() { test01(); system("pause"); return 0; }
#include<iostream> using namespace std; #include<list> void printList(list<int>& l) { for (list<int>::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); l1.push_back(50); printList(l1); list<int>l2(l1.begin(), l1.end()); printList(l1); list<int>l3(l2); printList(l3); list<int>l4(10,100); printList(l4); } int main() { test01(); system("pause"); return 0; }
#include<iostream> using namespace std; #include<list> void printList(list<int>& l) { for (list<int>::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); l1.push_back(50); printList(l1); // 赋值 list<int>l2; l2 = l1; printList(l2); list<int>l3; l3.assign(l1.begin(),l1.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); l1.push_back(50); list<int>l2; l2.assign(10, 100); cout << "交换前:" << endl; printList(l1); printList(l2); cout << "交换后:" << endl; l1.swap(l2); printList(l1); printList(l2); } int main() { //test01(); test02(); system("pause"); return 0; }
#include<iostream> using namespace std; #include<list> void printList(list<int>& l) { for (list<int>::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); l1.push_back(50); printList(l1); if (l1.empty()) { cout << "l1为空" << endl; } else { cout << "l1不为空" << endl; cout << "l1的大小为:" << l1.size() << endl; } // 重新指定大小 l1.resize(10); printList(l1); l1.resize(2); printList(l1); } int main() { test01(); system("pause"); return 0; }
#include<iostream> using namespace std; #include<list> void printList(list<int>& l) { for (list<int>::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_front(100); l1.push_front(200); l1.push_front(300); printList(l1); // 尾删 l1.pop_back(); printList(l1); // 头删 l1.pop_front(); printList(l1); // 插入 list<int>::iterator it = l1.begin(); l1.insert(++it, 1000); printList(l1); // 删除 it = l1.begin(); l1.erase(++it); printList(l1); // 移除 l1.push_back(10000); l1.push_back(10000); l1.push_back(10000); printList(l1); l1.remove(10000); printList(l1); // 清空 l1.clear(); printList(l1); } int main() { test01(); system("pause"); return 0; }
#include<iostream> using namespace std; #include<list> void printList(list<int>& l) { for (list<int>::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_front(100); l1.push_front(200); l1.push_front(300); //cout << l1.at(0) << endl; // 错误,不支持at访问数据 //cout << l1[0] << endl; // 错误,不支持[ ]访问数据 // 原因:list链表不是用连续的线性空间存储,所以迭代器不支持随机访问 cout << " 第一个元素为: "<<l1.front() << endl; cout << " 最后一个元素为: " << l1.back() << endl; // list容器的迭代器是双向迭代器,不支持随机访问 list<int>::iterator it = l1.begin(); //it = it + 1; // 错误,不可以跳跃访问(it = it + n),即使是it = it + 1 // 只支持 ++ -- it++; it--; } int main() { test01(); system("pause"); return 0; }
#include<iostream> using namespace std; #include<list> void printList(list<int>& l) { for (list<int>::iterator it = l.begin(); it != l.end(); it++) { cout << *it << " "; } cout << endl; } bool compare(int val1, int val2) { // 降序,就是让第一个 > 第二个 return val1 > val2; } void test01() { list<int>l1; //尾插 l1.push_back(10); l1.push_back(20); l1.push_back(30); // 头插 l1.push_front(100); l1.push_front(200); l1.push_front(300); printList(l1); // 反转容器中的元素 l1.reverse(); // 默认的排序规则 从小到大 printList(l1); l1.sort(compare); // 指定规则,从大到小 printList(l1); } int main() { test01(); system("pause"); return 0; }
将Person自定义数据类型进行排序,Person中属性有姓名、年龄、身高
按照年龄进行升序,如果年龄相同按照身高进行降序
#include<iostream> using namespace std; #include<string> #include<list> class Person { public: Person(string name, int age, int height ) { this->m_Name = name; this->m_Height = height; this->m_Age = age; } public: string m_Name; int m_Age; int m_Height; }; bool comparePerson(Person& p1,Person& p2) { if (p1.m_Age == p2.m_Age) { return p1.m_Age > p2.m_Height; } else { return p1.m_Age > p2.m_Age; } } void test01() { Person p1("刘备", 35, 175); Person p2("曹操", 45, 185); Person p3("孙权", 40, 170); Person p4("赵云", 25, 190); Person p5("张飞", 35, 160); Person p6("关羽", 35, 200); list<Person> L1; L1.push_back(p1); L1.push_back(p2); L1.push_back(p3); L1.push_back(p4); L1.push_back(p5); L1.push_back(p6); for (list<Person>::iterator pit = L1.begin(); pit != L1.end(); pit++) { cout << " 姓名:" << (*pit).m_Name << " 年龄:" << pit->m_Age << " 身高:" << pit->m_Height <<endl; } cout << endl; cout << "-----------------------------" << endl; L1.sort(comparePerson); // 排序 for (list<Person>::iterator pit = L1.begin(); pit != L1.end(); pit++) { cout << "姓名:" << (*pit).m_Name << " 年龄:" << pit->m_Age << " 身高:" << pit->m_Height << endl; } cout << endl; } int main() { test01(); system("pause"); return 0; }
#include<iostream> using namespace std; #include<set> void printList(set<int>& l) { for (set<int>::iterator it = l.begin(); it != l.end(); it++) { cout << *it << " "; } cout << endl; } void test01() { set<int>l1; l1.insert(10); l1.insert(20); l1.insert(30); l1.insert(40); l1.insert(50); printList(l1); // 拷贝构造 set<int>s2(l1); printList(s2); // 赋值 set<int>s3; s3 = s2; printList(s3); } int main() { test01(); system("pause"); return 0; }
#include<iostream> using namespace std; #include<set> void printList(set<int>& l) { for (set<int>::iterator it = l.begin(); it != l.end(); it++) { cout << *it << " "; } cout << endl; } void test01() { set<int>s1; s1.insert(10); s1.insert(20); s1.insert(30); s1.insert(40); s1.insert(50); printList(s1); if (s1.empty()) { cout << "s1为空" << endl; } else { cout << "s1不为空" << endl; cout << "s1的大小为" <<s1.size()<< endl; } } // 交换 void test02() { set<int> s1; s1.insert(10); s1.insert(20); s1.insert(30); s1.insert(40); s1.insert(50); set<int> s2; s2.insert(100); s2.insert(200); s2.insert(300); s2.insert(400); s2.insert(500); cout << "交换前" << endl; printList(s1); printList(s2); cout << endl; cout << "交换后" << endl; s1.swap(s2); printList(s1); printList(s2); cout << endl; } int main() { //test01(); test02(); system("pause"); return 0; }
#include<iostream> using namespace std; #include<set> void printList(set<int>& l) { for (set<int>::iterator it = l.begin(); it != l.end(); it++) { cout << *it << " "; } cout << endl; } void test01() { set<int>s1; s1.insert(10); s1.insert(20); s1.insert(30); s1.insert(40); s1.insert(50); printList(s1); // 删除 s1.erase(s1.begin()); printList(s1); s1.erase(30); printList(s1); //清空 //s1.erase(s1.begin(), s1.end()); s1.clear(); printList(s1); } int main() { test01(); system("pause"); return 0; }
#include<iostream> using namespace std; #include<set> void test01() { set<int>s1; s1.insert(10); s1.insert(20); s1.insert(30); s1.insert(40); s1.insert(50); // 查找 set<int>::iterator pos = s1.find(30); if (pos != s1.end()) { cout << "找到了元素:" << *pos << endl; } else { cout << "未找到元素" << endl; } //统计 int num = s1.count(30); cout << "num = " << num << endl; } int main() { test01(); system("pause"); return 0; }
#include<iostream> using namespace std; #include<set> // set和multiset区别 void test01() { set<int> s; // 在向set中插入数据的时候,会返回一个pair对组,对组中有两个值,一个是迭代器,另外一个表示是否插入成功 pair<set<int>::iterator, bool> ret = s.insert(10); if (ret.second) { cout << "第一次插入成功!" << endl; } else { cout << "第一次插入失败!" << endl; } ret = s.insert(10); if (ret.second) { cout << "第二次插入成功!" << endl; } else { cout << "第二次插入失败!" << endl; } // multiset multiset<int> ms; ms.insert(10); ms.insert(10); for (multiset<int>::iterator it = ms.begin(); it != ms.end(); it++) { cout << *it << " "; } cout << endl; } int main() { test01(); system("pause"); return 0; }
#include<iostream> using namespace std; #include<string> void test01() { pair<string, int>p(string("Tom"), 20); cout << "姓名:" << p.first << " 年龄:" << p.second << endl; pair<string, int>p2 = make_pair(string("Jerry"), 20); cout << "姓名:" << p2.first << " 年龄:" << p2.second << endl; } int main() { test01(); system("pause"); return 0; }
#include<iostream> using namespace std; #include<string> #include<set> class Mycompare { public: bool operator()(int val1, int val2) { return val1 > val2; } }; void test01() { set<int> s1; s1.insert(10); s1.insert(40); s1.insert(20); s1.insert(50); 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(40); s2.insert(50); s2.insert(20); s2.insert(30); for (set<int>::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<string> #include<set> class Person { public: Person(string name, int age) { this->m_Name = name; this->m_Age = age; } public: string m_Name; int m_Age; }; class MycomparePerson { public: bool operator()(const Person& p1,const Person& p2) { // 按照年龄进行排序 降序 return p1.m_Age > p2.m_Age; } }; void test01() { set<Person,MycomparePerson> s; Person p1("刘备", 23); Person p2("关羽", 27); Person p3("张飞", 25); Person p4("赵云", 31); s.insert(p1); s.insert(p2); s.insert(p3); s.insert(p4); for (set<Person, MycomparePerson>::iterator it = s.begin(); it != s.end(); it++) { cout <<"姓名:"<< (*it).m_Name << " 年龄:"<<it->m_Age << endl; } cout << endl; } int main() { test01(); system("pause"); return 0; }
#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<int, int>m; // 默认构造 m.insert(pair<int, int>(1, 10)); m.insert(pair<int, int>(2, 20)); m.insert(pair<int, int>(3, 30)); printMap(m); map<int, int>m2(m); //拷贝构造 printMap(m2); map<int, int>m3; m3 = m2; printMap(m3); } int main() { test01(); system("pause"); return 0; }
#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<int, int>m; // 默认构造 m.insert(pair<int, int>(1, 10)); m.insert(pair<int, int>(2, 20)); m.insert(pair<int, int>(3, 30)); if (m.empty()) { cout << "m为空!" << endl; } else { cout << "m不为空" << endl; cout << "m的大小为:" << m.size() << endl; } } void test02() { 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)); map<int, int>m2; // 默认构造 m2.insert(pair<int, int>(4, 100)); m2.insert(pair<int, int>(5, 200)); m2.insert(pair<int, int>(6, 300)); cout << "交换前" << endl; printMap(m); printMap(m2); cout << "交换后" << endl; m.swap(m2); printMap(m); printMap(m2); } int main() { test02(); system("pause"); return 0; }
#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<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; printMap(m); // 删除 m.erase(m.begin()); printMap(m); m.erase(3); printMap(m); // qingkon m.clear(); // m.erase(m.begin()mm.end()); printMap(m); } int main() { test01(); system("pause"); return 0; }
#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<int, int>m; // 默认构造 m.insert(pair<int, int>(1, 10)); m.insert(pair<int, int>(2, 20)); m.insert(pair<int, int>(3, 30)); // 查找 map<int, int>::iterator pos = m.find(3); if (pos != m.end()) { cout << "找到了元素key:" << (*pos).first << " value = " << (*pos).second << endl; } else { cout << "未找到元素!" << endl; } // 统计 int num = m.count(3); cout << "num = " << num << endl; } int main() { test01(); system("pause"); return 0; }
#include<iostream> using namespace std; #include<map> class MyCompare{ public: bool operator()(int v1, int v2){ return v1 > v2; } }; void test01() { // 默认从小到大排序 // 利用仿函数实现从大到小排序 map<int, int,MyCompare>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)); for (map<int, int>::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; }
#include<iostream> using namespace std; #include<string> #include<vector> #include<map> #include<ctime> #define CEHUA 0 #define MEISHU 1 #define YANFA 2 class Worker { public: string m_Name; int m_Salary; }; void createWorker(vector<Worker>& v) { string nameSeed = "ABCDEFGHIJ"; for (int i = 0; i < 10; i++) { Worker worker; worker.m_Name = "员工"; worker.m_Name += nameSeed[i]; worker.m_Salary = rand() % 10000 + 10000; // 10000-19999 // 将员工放到vector中 v.push_back(worker); } } // 员工分组 void serGroup(vector<Worker>&v, multimap<int, Worker>&m) { for (vector<Worker>::iterator it = v.begin(); it != v.end(); it++) { // 产生随机部门编号 int deptId = rand() % 3;// 0 1 2 // 将员工插入到分组中 // key是部门编号 value是具体员工 m.insert(pair<int, Worker>(deptId, *it)); } } // 显示员工分组 void showWorkerByGroup(multimap<int, Worker>& m) { // 0 A B C 1 D E 2 F G .. cout << "策划部门:" << endl; multimap<int, Worker>::iterator pos = m.find(CEHUA); int count = m.count(CEHUA); int index = 0; for (; pos != m.end() && index < count; pos++,index++) { cout << "姓名:" << pos->second.m_Name << " 工资:" << pos->second.m_Salary << endl; } cout << "-----------------------------------" << endl; cout << "美术部门:" << endl; pos = m.find(MEISHU); count = m.count(MEISHU); index = 0; for (; pos != m.end() && index < count; pos++, index++) { cout << "姓名:" << pos->second.m_Name << " 工资:" << pos->second.m_Salary << endl; } cout << "-----------------------------------" << endl; cout << "研发部门:" << endl; pos = m.find(YANFA); count = m.count(YANFA); index = 0; for (; pos != m.end() && index < count; pos++, index++) { cout << "姓名:" << pos->second.m_Name << " 工资:" << pos->second.m_Salary << endl; } } int main() { srand((unsigned int)time(NULL)); // 1 创建员工 vector<Worker>vWorker; createWorker(vWorker); // 2 员工分组 multimap<int, Worker>mWorker; serGroup(vWorker, mWorker); // 3 显示员工分组 showWorkerByGroup(mWorker); system("pause"); return 0; }