alin的学习之路(STL篇:一)(string,vector,deque)

3 篇文章 0 订阅

alin的学习之路(STL篇:一)(string,vector,deque)

1.STL概述

  1. STL 标准模板库:standard template libary

  2. STL 六大组件:容器 算法 迭代器 仿函数 适配器 空间配置器

  3. STL 优点:

    1. 内建在编译器中 不用额外安装插件
    2. 容器和算法分离实现,通过迭代器进行连接
    3. 不用考虑具体实现,熟练运用即可
    4. 高可重用性,高性能,高移植性,跨平台
  4. STL 三大组件

    1. 容器

      1. 序列式容器
      2. 关联式容器
    2. 算法

      1. 非质变算法
      2. 质变算法
    3. 迭代器

      1. 共5种

      2. 常用的是双向迭代器和随机访问迭代器

2.STL初识

  1. vector的三种遍历方式

    void myPrintInt(int val)
    {
    	cout << val << endl;
    }
    void test01()
    {
    	vector<int>v;
    	v.push_back(10);
    	v.push_back(20);
    	v.push_back(30);
    	v.push_back(40);
    
    
    	//三种遍历方式
    	//第一种
    	/*vector<int>::iterator itBegin = v.begin();
    	vector<int>::iterator itEnd = v.end();
    	while (itBegin != itEnd)
    	{
    		cout << *itBegin << endl;
    		itBegin++;
    	}*/
    
    	//第二种
    	//for (vector<int>::iterator it = v.begin(); it != v.end(); ++it)
    	//{
    	//	//*it -> int
    	//	cout << *it << endl;
    	//}
    
    	//第三种  //要包含头文件#include <algorithm>
    	for_each(v.begin(),v.end(),myPrintInt);
    }
    
  2. vector中存放自定义数据类型

    class Person {
    public:
    	Person(string name, int age)
    	{
    		this->m_Name = name;
    		this->m_Age = age;
    	}
    	string m_Name;
    	int m_Age;
    };
    
    void test02()
    {
    	vector<Person> v;
    
    	Person p1("aaa", 10);
    	Person p2("bbb", 20);
    	Person p3("ccc", 30);
    	Person p4("ddd", 40);
    
    	v.push_back(p1);
    	v.push_back(p2);
    	v.push_back(p3);
    	v.push_back(p4);
    
    	for (vector<Person>::iterator it = v.begin(); it != v.end(); ++it)
    	{
    		//*it 代表for循环中vector后面间括号中的类型
    		//*it -> Person   it 相当于 Person*
    		cout << "姓名: " << (*it).m_Name << " 年龄:" << it->m_Age << endl;
    	}
    }
    
  3. vector中存放自定义数据类型的指针

    class Person {
    public:
    	Person(string name, int age)
    	{
    		this->m_Name = name;
    		this->m_Age = age;
    	}
    	string m_Name;
    	int m_Age;
    };
    void test03()
    {
    	vector<Person*> v;
    
    	Person p1("aaa", 10);
    	Person p2("bbb", 20);
    	Person p3("ccc", 30);
    	Person p4("ddd", 40);
    
    	v.push_back(&p1);
    	v.push_back(&p2);
    	v.push_back(&p3);
    	v.push_back(&p4);
    
    	for (vector<Person*>::iterator it = v.begin(); it != v.end(); ++it)
    	{
    		cout << "姓名: " << (*it)->m_Name << " 年龄:" << (*it)->m_Age << endl;
    	}
    }
    
  4. vector容器的嵌套

    void test04()
    {
    	vector<vector<int> >v;
    	vector<int>v1;
    	vector<int>v2;
    	vector<int>v3;
    
    	for (int i = 0; i < 5; ++i)
    	{
    		v1.push_back(i + 1);
    		v2.push_back(i + 2);
    		v3.push_back(i + 3);
    	}
    
    	v.push_back(v1);
    	v.push_back(v2);
    	v.push_back(v3);
    
    	for (vector<vector<int> >::iterator it = v.begin(); it != v.end(); ++it)
    	{
    		//*it-> vector<int>  内层循环使用*it的迭代器
    		for (vector<int>::iterator vit = (*it).begin(); vit != (*it).end(); ++vit)
    		{
    			cout << *vit << " ";
    		}
    		cout << endl;
    	}
    }
    

3.string

  1. string的构造函数和基本赋值操作

    1. string 构造函数
      string();//创建一个空的字符串 例如: string str;
      string(const string& str);//使用一个string对象初始化另一个string对象
      string(const char* s);//使用字符串s初始化
      string(int n, char c);//使用n个字符c初始化

    2. string基本赋值操作
      string& operator=(const char* s);//char*类型字符串 赋值给当前的字符串
      string& operator=(const string &s);//把字符串s赋给当前的字符串
      string& operator=(char c);//字符赋值给当前的字符串
      string& assign(const char *s);//把字符串s赋给当前的字符串
      string& assign(const char *s, int n);//把字符串s的前n个字符赋给当前的字符串
      string& assign(const string &s);//把字符串s赋给当前字符串
      string& assign(int n, char c);//用n个字符c赋给当前字符串
      string& assign(const string &s, int start, int n);//将s从start开始n个字符赋值给字符串

    void test01()
    {
    	string str1;
    	string str2 = str1;
    	string str3 = "abc";
    	string str4(10, 'a');
    
    	cout << "str1 = " << str1 << endl;
    	cout << "str2 = " << str2 << endl;
    	cout << "str3 = " << str3 << endl;
    	cout << "str4 = " << str4 << endl;
    
    	str1 = "def";				//def
    	str2 = str1;				//def
    	str3.assign("abcde", 4);	//abcd
    	//string& assign(const string &s, int start, int n);//将s从start开始n个字符赋值给字符串
    	str4.assign(str3, 1, 2);	//bc
    
    	cout << "str1 = " << str1 << endl;
    	cout << "str2 = " << str2 << endl;
    	cout << "str3 = " << str3 << endl;
    	cout << "str4 = " << str4 << endl;
    }
    
    
  2. string存取字符操作
    char& operator[](int n);//通过[]方式取字符
    char& at(int n);//通过at方法获取字符

    注意:[]与at()的主要区别在于越界访问的处理,[]会代码崩掉,at()会抛出out_of_range异常

    void test02()
    {
    	string str1 = "abcdef";
    	for (int i = 0; i < str1.size(); ++i)
    	{
    		//cout << str1[i];
    		cout << str1.at(i);
    	}
    	cout << endl;
    
    	//[]和at() 的区别在于越界访问时[]会代码崩掉,at()会抛出out_of_range异常
    	try {
    		//cout << str1[100] << endl;
    		cout << str1.at(100) << endl;
    	}
    	catch (exception& e)
    	{
    		cout << e.what() << endl;
    	}
    	
    }
    
  3. string拼接操作
    string& operator+=(const string& str);//重载+=操作符
    string& operator+=(const char* str);//重载+=操作符
    string& operator+=(const char c);//重载+=操作符
    string& append(const char *s);//把字符串s连接到当前字符串结尾
    string& append(const char *s, int n);//把字符串s的前n个字符连接到当前字符串结尾
    string& append(const string &s);//同operator+=()
    string& append(const string &s, int pos, int n);//把字符串s中从pos开始的n个字符连接到当前字符串结尾
    string& append(int n, char c);//在当前字符串结尾添加n个字符c

void test03()
{
	string str1 = "我爱";
	str1 += "北京";
	cout << str1 << endl;
	str1.append("天安门");
	cout << str1 << endl;
}
  1. string查找和替换
    int find(const string& str, int pos = 0) const; //查找str第一次出现位置,从pos开始查找
    int find(const char* s, int pos = 0) const; //查找s第一次出现位置,从pos开始查找
    int find(const char* s, int pos, int n) const; //从pos位置查找s的前n个字符第一次位置
    int find(const char c, int pos = 0) const; //查找字符c第一次出现位置
    int rfind(const string& str, int pos = npos) const;//查找str最后一次位置,从pos开始查找
    int rfind(const char* s, int pos = npos) const;//查找s最后一次出现位置,从pos开始查找
    int rfind(const char* s, int pos, int n) const;//从pos查找s的前n个字符最后一次位置
    int rfind(const char c, int pos = 0) const; //查找字符c最后一次出现位置
    string& replace(int pos, int n, const string& str); //替换从pos开始n个字符为字符串str
    string& replace(int pos, int n, const char* s); //替换从pos开始的n个字符为字符串s
void test04()
{
	string str = "abcdefg";
	int pos = str.find('d');
	if (pos == -1)
	{
		cout << "未找到子串" << endl;
	}
	else
	{
		cout << "找到了子串 位置是:" << pos << endl;
	}

	str.replace(1, 3, "11111");
	cout << str << endl;
}
  1. string比较操作
    compare函数在>时返回 1,<时返回 -1,==时返回 0。
    比较区分大小写,比较时参考字典顺序,排越前面的越小。
    大写的A比小写的a小。
    int compare(const string &s) const;//与字符串s比较
    int compare(const char *s) const;//与字符串s比较

    void test05()
    {
    	string str1 = "abcde";
    	string str2 = "abcde";
    
    	if (str1.compare(str2) == 0)
    	{
    		cout << "str1 == str2" << endl;
    	}
    	else if (str1.compare(str2) < 0)
    	{
    		cout << "str1 < str2" << endl;
    	}
    	else {
    		cout << "str1 > str2" << endl;
    	}
    }
    
  2. string子串
    string substr(int pos = 0, int n = npos) const;//返回由pos开始的n个字符组成的字符串

    void test06()
    {
    	string str = "abc";
    	string temp = str.substr(0, 2);
    	cout << temp << endl;
    }
    
  3. string案例

    //取邮箱中的用户名
    void test07()
    {
    	string str = "alin123@163.com";
    	int pos = str.find('@');
    	cout << str.substr(0, pos) << endl;
    }
    
    //取出.分割的字符串
    void test08()
    {
    	vector<string> v;
    
    	string str = "www.itcast.com.cn";
    	int start = 0;
    	int pos = 0;
    	while (true)
    	{
    		//从start开始搜索'.'
    		pos = str.find('.', start);
    		if (pos == -1)
    		{
    			string temp = str.substr(start, str.size() - start);
    			v.push_back(temp);
    			break;
    		}
    		//截取子串
    		string temp = str.substr(start, pos - start);
    		v.push_back(temp);
    
    		//更新start
    		start = pos + 1;
    	}
    	for (vector<string>::iterator it = v.begin(); it != v.end(); ++it)
    	{
    		cout << *it << endl;
    	}
    }
    
    
  4. string插入和删除操作
    string& insert(int pos, const char* s); //插入字符串
    string& insert(int pos, const string& str); //插入字符串
    string& insert(int pos, int n, char c);//在指定位置插入n个字符c
    string& erase(int pos, int n = npos);//删除从Pos开始的n个字符

    void test09()
    {
    	string str = "abcdefg";
    	str.insert(1, "111");
    
    	str.erase(1, 3);
    	cout << "str = " << str << endl;
    }
    
  5. string和const char*的转换

    //string 和 const char * 相互转换
    void func1(string str)
    {
    
    }
    void func2(const char *)
    {
    
    }
    void test10()
    {
    	string str1 = "abcdef";
    	const char* str2 = str1.c_str();
    	
    	//string 转 const char*
    	string str3(str2);
    
    	cout << str3 << endl;
    
    	func1(str2); //const char* 可以隐式转换为 string
    	//func2(str3); //string 不可以隐式转换为 const char*
    }
    
    
  6. string的引用失效

    void test11()
    {
    	string str = "abcdef";
    	char &a = str[1];
    	char &b = str[2];
    
    	a = 'z';
    	b = 'z';
    
    	str = "pppppppppppppppppppppp";
    
    	//string变更为更长的字符串时会重新分配内存,原有的引用会失效,再次使用原来的引用会出错
    	/*a = 'z';
    	b = 'z';*/
    
    	cout << str << endl;
    }
    
  7. string大小写转换

    //大小写转换
    void test12()
    {
    	string str = "AaBbCc";
    	for (int i = 0; i < str.size(); ++i)
    	{
    		//str[i] = toupper(str[i]);
    		str[i] = tolower(str[i]);
    	}
    	cout << str << endl;
    }
    

4.vector

  1. 扩容规则

    void test01()
    {
    	vector<int> v;
    	for (int i = 0; i < 10; i++) {
    		v.push_back(i);
    		cout << v.capacity() << endl;  // v.capacity()容器的容量
    	}
    }
    
  2. vector构造函数和常用赋值操作

    1. vector构造函数
      vector v; //采用模板实现类实现,默认构造函数
      vector(v.begin(), v.end());//将v[begin(), end())区间中的元素拷贝给本身。
      vector(n, elem);//构造函数将n个elem拷贝给本身。
      vector(const vector &vec);//拷贝构造函数。

      //例子 使用第二个构造函数 我们可以…
      int arr[] = {2,3,4,1,9};
      vector v1(arr, arr + sizeof(arr) / sizeof(int));

    2. vector常用赋值操作
      assign(beg, end);//将[beg, end)区间中的数据拷贝赋值给本身。
      assign(n, elem);//将n个elem拷贝赋值给本身。
      vector& operator=(const vector &vec);//重载等号操作符
      swap(vec);// 将vec与本身的元素互换。

    void printVector(vector<int>& v)
    {
    	for (vector<int>::iterator it = v.begin(); it != v.end(); ++it)
    	{
    		cout << *it <<" ";
    	}
    	cout << endl;
    }
    
    void test02()
    {
    	vector<int> v;
    
    	int arr[] = { 2, 3, 4, 1, 5 };
    
    	vector<int> v1(arr, arr + sizeof(arr) / sizeof(arr[0]));
    	vector<int> v2(v1.begin(), v1.end());
    	vector<int> v3(10,100);
    	vector<int> v4(v3);
    
    	printVector(v1);
    	printVector(v2);
    	printVector(v3);
    	printVector(v4);
    
    	vector<int> v5;
    	v5.assign(v1.begin(), v1.end());
    	printVector(v5);
    
    	cout << "v1与v3交换前:" << endl;
    	printVector(v1);
    	printVector(v3);
    
    	v1.swap(v3);
    
    	cout << "v1与v3交换后:" << endl;
    	printVector(v1);
    	printVector(v3);
    
    }
    
    
  3. vector大小操作和数据存取

    1. vector大小操作
      size();//返回容器中元素的个数
      empty();//判断容器是否为空
      resize(int num);//重新指定容器的长度为num,若容器变长,则以默认值填充新位置。如果容器变短,则末尾超出容器长度的元素被删除。
      resize(int num, elem);//重新指定容器的长度为num,若容器变长,则以elem值填充新位置。如果容器变短,则末尾超出容器长>度的元素被删除。
      capacity();//容器的容量
      reserve(int len);//容器预留len个元素长度,预留位置不初始化,元素不可访问。

    2. vector数据存取操作
      at(int idx); //返回索引idx所指的数据,如果idx越界,抛出out_of_range异常。
      operator[];//返回索引idx所指的数据,越界时,运行直接报错
      front();//返回容器中第一个数据元素
      back();//返回容器中最后一个数据元素

    void test03()
    {
    	int arr[] = { 2, 3, 4, 1, 5 };
    	vector<int>v1(arr, arr + sizeof(arr) / sizeof(int));
    
    	if (v1.empty())
    	{
    		cout << "v1为空" << endl;
    	}
    	else
    	{
    		cout << "v1的大小为:" << v1.size() << endl;
    	}
    	   
    	v1.resize(10,100);   //指定大小,并指定用什么值填充
    	printVector(v1);
    
    	v1.resize(3);
    	printVector(v1);
    
    	cout << "首元素:" << v1.front() << endl;
    	cout << "尾元素:" << v1.back() << endl;
    
    }
    
  4. 巧用swap()收缩内存

    void tset04()
    {
    	vector<int> v;
    	for (int i = 0; i < 100000; ++i)
    	{
    		v.push_back(i);
    	}
    	cout << "容量:" << v.capacity() << endl;
    	cout << "大小:" << v.size() << endl;
    
    	v.resize(3);
    	cout << "容量:" << v.capacity() << endl;
    	cout << "大小:" << v.size() << endl;
    
    	vector<int>(v).swap(v);
    	cout << "容量:" << v.capacity() << endl;
    	cout << "大小:" << v.size() << endl;
    }
    
  5. 巧用reserve预留内存
    注意事项:reserve 预留 reverse 反转

    void test05()
    {
    	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])
    		{
    			p = &v[0];
    			num++;
    		}
    	}
    	cout << num << endl;
    }
    
  6. vector的插入和删除
    insert(const_iterator pos, int count,ele);//迭代器指向位置pos插入count个元素ele.
    push_back(ele); //尾部插入元素ele
    pop_back();//删除最后一个元素
    erase(const_iterator start, const_iterator end);//删除迭代器从start到end之间的元素
    erase(const_iterator pos);//删除迭代器指向的元素
    clear();//删除容器中所有元素

    void test06()
    {
    	int arr[] = { 2, 3, 4, 1, 5 };
    	vector<int>v1(arr, arr + sizeof(arr) / sizeof(int));
    
    	v1.insert(v1.begin(), 1000);      //首位置插入1个1000
    	printVector(v1);  // 1000 2 3 4 1 5
    
    	v1.insert(v1.begin(), 2, 2000);    //首位置插入两个2000
    	printVector(v1);
    
    	v1.push_back(3000);     //末尾插入一个3000
    	printVector(v1);
    	v1.pop_back();          //删除最后一个元素
    	printVector(v1);
    
    	v1.erase(v1.begin());   //删掉首元素
    	printVector(v1);
    
    	//v1.erase(v1.begin(), v1.end());   //清空vector
    	v1.clear();       //清空vector
    	printVector(v1);
    }
    
    
  7. vector逆序遍历

    //逆序遍历
    void test07()
    {
    	int arr[] = { 2, 3, 4, 1, 5 };
    	vector<int>v1(arr, arr + sizeof(arr) / sizeof(int));
    
    	//注意逆序遍历vector要用reverse_iterator迭代器,rbegin()和rend(),还是要it++
    	for (vector<int>::reverse_iterator it = v1.rbegin(); it != v1.rend(); ++it)
    	{
    		cout << *it << " ";
    	}
    	cout << endl;
    }
    
    
  8. 证明迭代器的种类

    void test08()
    {
    	vector<int> v;
    	vector<int>::iterator itBegin = v.begin();
    	itBegin++;
    	itBegin--;//支持++和--,证明至少是双向迭代器
    
    	itBegin = itBegin + 1; //证明是随机访问迭代器
    
    	list<int>L;
    	list<int>::iterator itLBegin = L.begin();
    	itLBegin++;
    	itLBegin--; //证明是双向迭代器
    
    	//itLBegin = itLBegin + 1;   //报错,证明不是随机访问迭代器
    
    }
    

5.deque

  1. deque的构造函数,赋值操作和大小操作

    1. deque构造函数
      deque deqT;//默认构造形式
      deque(beg, end);//构造函数将[beg, end)区间中的元素拷贝给本身。
      deque(n, elem);//构造函数将n个elem拷贝给本身。
      deque(const deque &deq);//拷贝构造函数。

    2. deque赋值操作
      assign(beg, end);//将[beg, end)区间中的数据拷贝赋值给本身。
      assign(n, elem);//将n个elem拷贝赋值给本身。
      deque& operator=(const deque &deq); //重载等号操作符
      swap(deq);// 将deq与本身的元素互换

    3. deque大小操作
      deque.size();//返回容器中元素的个数
      deque.empty();//判断容器是否为空
      deque.resize(num);//重新指定容器的长度为num,若容器变长,则以默认值填充新位置。如果容器变短,则末尾超出容器长度的元素被删除。
      deque.resize(num, elem); //重新指定容器的长度为num,若容器变长,则以elem值填充新位置,如果容器变短,则末尾超出容器长度的元素被删除。

    void printDeque(const deque<int>& d)   
    {
    	for (deque<int>::const_iterator it = d.begin(); it != d.end(); ++it)   //只读迭代器
    	{
    		cout << *it << " ";
    	}
    	cout << endl;
    }
    void test01()
    {
    	deque<int>d;
    	d.push_back(10);
    	d.push_back(20);
    	d.push_back(30);
    	d.push_front(100);
    	d.push_front(200);
    	d.push_front(300);
    
    	if (d.empty())
    	{
    		cout << "d为空" << endl;
    	}
    	else {
    		cout << "d不为空,d的大小为:" << d.size() << endl;
    	}
    
    	printDeque(d);
    }
    
  2. deque的数据存取和插入删除

    1. deque双端插入和删除操作
      push_back(elem);//在容器尾部添加一个数据
      push_front(elem);//在容器头部插入一个数据
      pop_back();//删除容器最后一个数据
      pop_front();//删除容器第一个数据

    2. deque数据存取
      at(idx);//返回索引idx所指的数据,如果idx越界,抛出out_of_range。
      operator[];//返回索引idx所指的数据,如果idx越界,不抛出异常,直接出错。
      front();//返回第一个数据。
      back();//返回最后一个数据

    3. deque插入操作
      insert(pos,elem);//在pos位置插入一个elem元素的拷贝,返回新数据的位置。
      insert(pos,n,elem);//在pos位置插入n个elem数据,无返回值。
      insert(pos,beg,end);//在pos位置插入[beg,end)区间的数据,无返回值。

    4. deque删除操作
      clear();//移除容器的所有数据
      erase(beg,end);//删除[beg,end)区间的数据,返回下一个数据的位置。
      erase(pos);//删除pos位置的数据,返回下一个数据的位置。

    void test02()
    {
    	deque<int>d;
    	d.push_back(10);
    	d.push_back(20);
    	d.push_back(30);
    	d.push_front(100);
    	d.push_front(200);
    	d.push_front(300);
    	//300 200 100 10 20 30 
    	printDeque(d);
    
    	d.pop_back();
    	d.pop_front();
    	// 200 100 10 20
    	printDeque(d);
    
    	cout << "首元素为:" << d.front() << endl;
    	cout << "尾元素为:" << d.back() << endl;
    
    	deque<int>d2(2, 1000);
    	//d.insert(d.begin(), d2.begin(), d2.end());  // 1000 1000 200 100 10 20
    	//d.insert(++d.begin(), d2.begin(), d2.end());  // 200 1000 1000 100 10 20
    	//d.insert(d.begin()+3, d2.begin(), d2.end());  // 200 100 10 1000 1000 20
    	deque<int>::iterator it = d.begin();
    	d.insert(it+3, d2.begin(), d2.end());   // 200 100 10 1000 1000 20
    	
    	printDeque(d);
    
    
    }
    
  3. sort()排序 :需要加头文件#include <algorithm>

    bool myCompare(int v1, int v2)
    {
    	return v1 > v2;
    }
    
    //sort
    void test03()
    {
    	deque<int>d;
    	d.push_back(10);
    	d.push_back(20);
    	d.push_back(30);
    	d.push_front(100);
    	d.push_front(200);
    	d.push_front(300);
    
    	sort(d.begin(),d.end());   //默认升序
    	sort(d.begin(), d.end(),myCompare);   //添加回调函数改为降序
    	sort(d.begin(), d.end(), [](int v1,int v2) {     //lamda表达式:匿名函数
    		return v1 < v2;
    	});
    	printDeque(d);
    }
    
  4. deque作业案例

    /*
    	有5名选手:选手ABCDE,10个评委分别对每一名选手打分,去除最高分,去除评委中最低分,取平均分。
    	//1. 创建五名选手,放到vector中
    	//2. 遍历vector容器,取出来每一个选手,执行for循环,可以把10个评分打分存到deque容器中
    	//3. sort算法对deque容器中分数排序,pop_back pop_front去除最高和最低分
    	//4. deque容器遍历一遍,累加分数,累加分数/d.size()
    	//5. person.score = 平均分
    */
    class Person {
    public:
    	Person(string name, double score = 0)
    	{
    		this->m_Name = name;
    	}
    	double getScore()
    	{
    		return this->m_Score;
    	}
    	void setScore(double score)
    	{
    		this->m_Score = score;
    	}
    private:
    	string m_Name;
    	double m_Score;
    };
    
    
    void test01()
    {
    	Person p1("aaa");
    	Person p2("bbb");
    	Person p3("ccc");
    	Person p4("ddd");
    	Person p5("eee");
    
    	vector<Person> v;
    	v.push_back(p1);
    	v.push_back(p2);
    	v.push_back(p3);
    	v.push_back(p4);
    	v.push_back(p5);
    	int n = 1;
    	for (vector<Person>::iterator it = v.begin(); it != v.end(); ++it)
    	{
    		deque<int> d;
    
    		//评委打分
    		for (int i = 0; i < 10; ++i)
    		{
    			int num = rand() % 21 + 80;
    			d.push_back(num);
    		}
    		//先排序,后去头去尾
    		sort(d.begin(), d.end());
    		d.pop_back();
    		d.pop_front();
    
    		//求平均值
    		double sum = 0;
    		for (deque<int>::iterator dit = d.begin(); dit != d.end(); ++dit)
    		{
    			sum += (*dit);
    		}
    		sum /= d.size();
    
    		(*it).setScore(sum);
    		cout << "第" << n << "名选手的成绩为:" << sum << endl;
    		n++;
    	}
    }
    
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值