IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> 第九周知识总结 -> 正文阅读

[C++知识库]第九周知识总结

一、双指针

严格的来说,双指针只能说是是算法中的一种技巧。

双指针指的是在遍历的过程中,不是普通的使用单个指针进行访问,而是使用两个相同方向(快慢指针)或者相反方向(对撞指针)的指针进行扫描,从而达到题目的要求。

1.对撞指针就是将数组最左侧的元素定义为左指针(L),将数组最右侧的元素定义为右指针(R),然后两头向中间遍历数组。一般指针每次移动一个位置,结束条件为左指针与右指针逆向(L>R);

大致框架:

type name(int list[],int len)
{
 int left = 0;
 int right = len-1;
 while(left>right)
    {
      left++;
      //根据题目做一些判断,处理
      right--;
    }
}

2.快慢指针一般将慢指针初始值定为数组第一个元素每次向后移动一个位置,快指针一般初始值为第二个元素每次向后移动两个位置;结束条件:快慢指针重合或快指针到达数组最后一个位置。

注意:要判断快指针是否达到最后位置,否则可能会陷入死循环;

大致框架:

type name(int list[],int len)
{
 int slow = 0;
 int fast = 1;
 while(left>right)
    {
      slow++;
      //根据题目做一些判断,处理
      fast+=2;
      if(fast==len)//如果快指针到达最后位置结束循环
        break;
    }
}

二、STL容器中常见函数的用法

1.vector(使用时添加#<vector>头文件)

简单来说vector是一个可以根据需要自动变长的数组

? (1)定义:vector<typename> name;

? ? ? ? vector<typename> arrayname[arraysize];

? ? ? ? //arrayname[0]~arrayname[arraysize-1]都有一个vector容器

? ? ? ? vector<vector<typename>> name;?

? ? ? ? //相当于行和列都可自动变长的二维数组

? (2)vector容器内的访问可以直接用name[0]等下表访问

? ? ? ? ? 也可用迭代器访问:

? ? ? ? ? ?vector<typename>::iterator it; //此时可以通过*it访问vector中的元素

? (3)vector中的常用函数

? ? ? ?begin()? ? ? ? ? //取vector容器首地址

? ? ? ?end()? ? ? ? ? ? ?//取vector容器中的尾元素后一个地址

? ? ? ?push_back()? //在vector末尾添加一个元素? ? ? ? 用法:vectorName.push_back();

? ? ? ?pop_back()? ?//删除vector末尾元素? ? ? ? ? ? ? ? ? ? 用法:vectorName.pop_back();

? ? ? ?size()? ? ? ? ? ? //获取vector的长度? ? ? ? ? ? ? ? ? ? ? ? 用法:vectorName.size();

? ? ? ?insert? ? ? ? ? ? //在vector容器任意位置添加元素? 用法:vectorName.insert(begin()+x,add);

? ? ? ?clear()? ? ? ? ? //清空vector容器中的元素? ? ? ? ? ? ? 用法:vectorName.clear()

? ? ? ?erase()? ? ? ? ?//删除vector容器中某个位置或区间的元素

2.set(使用时添加#include<set>头文件)

翻译为集合,有自动去重并且按升序排列的功能

(1).set容器的定义使用方法即常见函数使用与vector基本相同,但是不同的是set容器只能通过迭代? ? ? ? ?器访问不能通过下标访问

(2).set中find函数的用法:

? ? ?vectorName.find(value)返回的是set中对应value位置的迭代器即地址

例:set<int>::iterator? ? it =??vectorName.find(value);

? ? printf("%d",*it);

3.map(使用时添加#include<map>头文件)

? ?翻译为映射,例:a[0]=29,a[4]=22;即该数组就是0>29,4>22的映射,但是数组只能用于int>int型的映? ? ?射,而map可以用于任意两种类型的映射,而且map也会基于键的值升序排列

?(1).定义:map<typename1,typename2> mapname;

?(2)? map可以通过下标访问,但map中的键是唯一的,当输入已存在的键时会将原来的值覆盖;

例:map<char,int> name0;

? ? map['c']=20;

? ? map['c']=30;

? ? printf("%d",map['c']);

输出结果为30

map也可用迭代器访问,map可以使用it->first来访问键,it->second来访问值;

三.结构体

大致语法结构
struct student{

int ID;

string name;

? ? ? struct teacher{? ? ? ? ? //可以在结构体中添加结构体

? ? ? ? ? ? ? ? string?name;

? ? ? ? ? ? ? ? int age;

? ? ? ? ? ? ? }name1

}name2;

赋值:

name2.ID = 19;

name2.name1.age = 18;

结构体数组,就是在数组中每一项都是一个结构体.

定义: struct name{

? ? ? ? ? ? ? ? ? ? ?int age;

? ? ? ? ? ? ? ? ? ? ?int size;

}name2[length];

sort比较排序函数,有三个参数前两个为需要排序的区间,最后一个为排序所用的函数,可以不给

例:

struct stu{??

? ? ? ? ? ? ? ? int age;

? ? ? ? ? ? ? }name1[10];

bool cmp(stu a,stu,b)

{ return a.age?>b.age};//从大到小排序

sort(stu,stu+10,cmp);

floor(),ceil(),round()分别对应向下取整,向上取整,四舍五入所用的函数

注意:floor()与ceil()返回的是double型数据,

例题:

洛谷T211372

#include<bits/stdc++.h>
using namespace std;
struct student{     //定义一个结构体数组存储数据 
       char name[10]; 
	   int  qm;
	   int  qm2;
	   int  ps;
	   int  zp;
       int  id;
}stu[100];
bool cmp(student a,student b)排序函数
{
    if(a.zp==b.zp)
        return a.id<b.id;
    else
        return a.zp>b.zp;
}
int main()
{ 
	int n;
	scanf("%d",&n);
	for(int i=0;i<n;i++)  //输入学生姓名,成绩 
	{
        stu[i].id = i;
		scanf("%s",&stu[i].name);
		scanf("%d",&stu[i].ps); 
		scanf("%d",&stu[i].qm); 
		stu[i].qm2 = (int)ceil(sqrt(stu[i].qm)*10.0);//ceil返回的是double类型,强转为int型 
		stu[i].zp = round(stu[i].ps*0.4+stu[i].qm2*0.6);//处理后的总评成绩 
	}
	sort(stu,stu+n,cmp);//从大到小排序
	for(int i=0;i<n;i++)//输出排序后的结果
	{
		printf("%s %d\n",stu[i].name,stu[i].zp);
	 }
	 return 0; 
 } 

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-04-26 11:24:29  更:2022-04-26 11:28:17 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 22:32:19-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码