【C++】C++初、中级语法速成(基于Java解释)

作者 : admin 本文共6511个字,预计阅读时间需要17分钟 发布时间: 2024-06-9 共3人阅读

不会有人大三了才知道打比赛不能用Java、python吧。这学期参加了天梯赛,就速学了一下C++的基本功能用来打比赛,最后水了一个国三,恭喜一下自己(bushi)
这篇主要基于Java的语法来解释C++,利于快速入门

目录

  • 头文件
  • 输入
  • STL
    • string容器
      • 查找和替换
      • 比较
      • 插入和删除
      • 子串
      • 和char数组的相互转化
      • 和数值类型的相互转化
    • vector容器
      • 插入和删除
      • 数据存取
    • deque容器
    • stack容器
    • queue容器
    • 排序
    • list容器
      • 插入和删除
      • 反转和排序
    • set/multiset容器
    • `advance()`函数
    • pair对组
    • **map/ multimap容器**
  • 算法
    • 遍历算法
      • **遍历过程中删除元素**
    • sort算法

头文件

万能头文件:#include

包含所有的头文件,一个搞定

using namespace std;

using namespace std; 是一个命名空间(namespace)的声明,它告诉编译器在代码中使用标准库的名称空间 std 中的所有元素而不需要显式指定。标准库 std 包含了 C++ 标准库中的大部分内容,包括常用的类、函数和对象。

在 C++ 中,为了防止名称冲突,不同的库、框架或者用户自定义的代码通常会放在不同的命名空间中。标准库中的内容都被放在了命名空间 std 中,所以如果你想在代码中使用标准库的元素,通常需要在代码中加上 std:: 前缀。例如,你可能会写 std::cout 表示标准输出流对象。

但是,通过 using namespace std; 的声明,你可以告诉编译器你要使用的是标准库中的内容,这样你就可以在代码中直接使用标准库的元素而不需要加上 std:: 前缀。这样做虽然简化了代码,但可能会引起命名冲突,特别是当你使用了多个命名空间中的相同名称时。

输入

scanner.nextxx()对应cin>>a

nextLine()对应getline(cin,string s)

要吸收回车符,直接使用getchar()

STL

容量查找插入存取删除
stringint length()int find(const string& str, int pos = 0) const;
//查找s第一次出现位置,从pos开始查找
int rfind(const string& str, int pos = npos) const; //查找str最后一次位置,从pos开始查找string& insert(int pos, const string& str); //插入字符串string& erase(int pos, int n = npos); //删除从Pos开始的n个字符
vectorsize()find(vecc.begin(), vecc.end(),要查找的值)push_back(ele); //尾插
insert(const_iterator pos, ele);front(); //返回容器中第一个数据元素
back(); //返回容器中最后一个数据元素pop_back();//删除最后一个元素
erase(const_iterator pos); //删除迭代器指向的元素,返回下一位置的迭代器
erase(const_iterator start, const_iterator end);//删除迭代器从start到end之间的元素
dequesize()push_back(elem); //在容器尾部添加一个数据
push_front(elem); //在容器头部插入一个数据insert(pos,elem); //在pos位置插入一个elem元素的拷贝,返回新数据的位置。front(); //返回容器中第一个数据元素
back(); //返回容器中最后一个数据元素pop_back(); //删除容器最后一个数据
pop_front(); //删除容器第一个数据
stacksize()push(elem); //向栈顶添加元素top(); //返回栈顶元素pop(); //从栈顶移除第一个元素
queuesize()push(elem); //往队尾添加元素back(); //返回最后一个元素
front(); //返回第一个元素pop(); //从队头移除第一个元素
listsize()push_back(elem);//在容器尾部加入一个元素push_front(elem);//在容器开头插入一个元素
insert(pos,elem);//在pos位置插elem元素的拷贝,返回新数据的位置。
front(); //返回第一个元素。
back(); //返回最后一个元素。pop_back();//删除容器中最后一个元素pop_front();//从容器开头移除第一个元素
erase(pos);//删除pos位置的数据,返回下一个数据的位置。remove(elem);//删除容器中所有与elem值匹配的元素。
set/multisetsize()find(key); //查找key是否存在,若存在,返回该键的元素的迭代器;若不存在,返回set.end();insert(elem); //在容器中插入元素。erase(pos); //删除pos迭代器所指的元素,返回下一个元素的迭代器。
erase(elm); //删除为elm的值
map/multimapsize()find(key); //查找key是否存在,若存在,返回该键的元素的迭代器;若不存在,返回set.end();insert(elem); //在容器中插入元素。erase(pos); //删除pos迭代器所指的元素,返回下一个元素的迭代器。
erase(key); //删除容器中值为key的元素。

int find(const string& str, int pos = 0) const;
//查找s第一次出现位置,从pos开始查找

int rfind(const string& str, int pos = npos) const; //查找str最后一次位置,从pos开始查找

erase(pos); //删除pos迭代器所指的元素,返回下一个元素的迭代器。

erase(key); //删除容器中值为key的元素。

insert(pos,elem);//在pos位置插elem元素的拷贝,返回新数据的位置。

front(); //返回第一个元素。

back(); //返回最后一个元素。

remove(elem);//删除容器中所有与elem值匹配的元素。

string容器

查找和替换

  • int find(const string& str, int pos = 0) const; //查找str第一次出现位置,从pos开始查找
  • int rfind(const string& str, int pos = npos) const; //查找str最后一次位置,从pos开始查找
  • string& replace(int pos, int n, const string& str); //替换从pos开始n个字符为字符串str

比较

  • 按照字典顺序比较:使用 <<=>>= 运算符进行比较,以确定两个字符串的字典顺序关系。
  • 按照字符数比较:使用 size()length() 函数获取字符串的长度,然后比较长度以确定哪个字符串包含更多字符。
  • 按照内容比较:使用 compare() 函数来直接比较两个字符串的内容。此函数返回一个整数,表示两个字符串的相对大小关系。

插入和删除

  • 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个字符

子串

string substr(int pos = 0, int n = npos) const; //返回由pos开始的n个字符组成的字符串

和char数组的相互转化

  1. char数组转string
char charArray[] = "Hello";
std::string str = charArray; // 使用构造函数
// 或者
std::string str2;
str2 = charArray; // 使用赋值运算符

  1. string转char数组
std::string str = "World";
const char* charArray = str.c_str();

和数值类型的相互转化

  1. string转化为数值

    stoX(string s)

    X为对应的类型缩写,如double为d,int为i,longlong为ll

  2. 数值类型转化为string

    string s = to_string(数值)

vector容器

单端数组,类似于Java中list

插入和删除

  • push_back(ele); //尾部插入元素ele
  • pop_back(); //删除最后一个元素
  • insert(const_iterator pos, ele); //迭代器指向位置pos插入元素ele
  • insert(const_iterator pos, int count,ele);//迭代器指向位置pos插入count个元素ele
  • erase(const_iterator pos); //删除迭代器指向的元素
  • erase(const_iterator start, const_iterator end);//删除迭代器从start到end之间的元素
    • 假如要删除第i个元素,i为int类型,只需要 vec.erase(vec.begin() + i); 即可
  • clear(); //删除容器中所有元素

数据存取

  • at(int idx); //返回索引idx所指的数据
  • operator[]; //返回索引idx所指的数据
  • front(); //返回容器中第一个数据元素
  • back(); //返回容器中最后一个数据元素

deque容器

双端数组

  • push_back(elem); //在容器尾部添加一个数据
  • push_front(elem); //在容器头部插入一个数据
  • pop_back(); //删除容器最后一个数据
  • pop_front(); //删除容器第一个数据

指定位置操作:

  • insert(pos,elem); //在pos位置插入一个elem元素的拷贝,返回新数据的位置。
  • insert(pos,n,elem); //在pos位置插入n个elem数据,无返回值。
  • insert(pos,beg,end); //在pos位置插入[beg,end)区间的数据,无返回值。
  • clear(); //清空容器的所有数据
  • erase(beg,end); //删除[beg,end)区间的数据,返回下一个数据的位置。
  • erase(pos); //删除pos位置的数据,返回下一个数据的位置。

其他部分和vector一致

stack容器

栈容器

pop()方法没有返回值。不会返回删除的元素,如果想要获取删除的元素,要先使用top()再使用pop()

构造函数:

  • stack stk; //stack采用模板类实现, stack对象的默认构造形式
  • stack(const stack &stk); //拷贝构造函数

赋值操作:

  • stack& operator=(const stack &stk); //重载等号操作符

数据存取:

  • push(elem); //向栈顶添加元素
  • pop(); //从栈顶移除第一个元素
  • top(); //返回栈顶元素

大小操作:

  • empty(); //判断堆栈是否为空
  • size(); //返回栈的大小

queue容器

队列容器

构造函数:

  • queue que; //queue采用模板类实现,queue对象的默认构造形式
  • queue(const queue &que); //拷贝构造函数

赋值操作:

  • queue& operator=(const queue &que); //重载等号操作符

数据存取:

  • push(elem); //往队尾添加元素
  • pop(); //从队头移除第一个元素
  • back(); //返回最后一个元素
  • front(); //返回第一个元素

大小操作:

  • empty(); //判断堆栈是否为空
  • size(); //返回栈的大小

排序

bool myCompare(pair<string,int>&p1,pair<string,int>&p2){
    if (p1.second<p2.second){
        return false;
    }else if (p1.second>p2.second){
        return true;
    }else{
        if(p1.first.compare(p2.first)<0)return true;
        else return false;
    }
}
  1. 自己写两个形参
  2. 返回true代表p1放在p2的前面(和Java的相反)

list容器

链表容器

插入和删除

  • push_back(elem);//在容器尾部加入一个元素
  • pop_back();//删除容器中最后一个元素
  • push_front(elem);//在容器开头插入一个元素
  • pop_front();//从容器开头移除第一个元素
  • insert(pos,elem);//在pos位置插elem元素的拷贝,返回新数据的位置。
  • insert(pos,n,elem);//在pos位置插入n个elem数据,无返回值。
  • insert(pos,beg,end);//在pos位置插入[beg,end)区间的数据,无返回值。
  • clear();//移除容器的所有数据
  • erase(beg,end);//删除[beg,end)区间的数据,返回下一个数据的位置。
  • erase(pos);//删除pos位置的数据,返回下一个数据的位置。
  • remove(elem);//删除容器中所有与elem值匹配的元素。

反转和排序

  • reverse(); //反转链表
  • sort(); //链表排序

set/multiset容器

所有容器都会在插入时自动被排序

set和multiset区别

  • set不允许容器中有重复的元素
  • multiset允许容器中有重复的元素

advance()函数

set和map不支持随机访问,所以他们对应的迭代器不能随意的加减,只能一个一个加

但是可以通过advance函数实现前进多步的操作

std::advance(it, 2); // 将迭代器前进两步

直接把这个迭代器往前移动,没有返回值

pair对组

  • pair p ( value1, value2 );
  • pair p = make_pair( value1, value2 );

map/ multimap容器

  • map中所有元素都是pair
  • pair中第一个元素为key(键值),起到索引作用,第二个元素为value(实值)
  • 所有元素都会根据元素的键值自动排序

map和multimap区别

  • map不允许容器中有重复key值元素
  • multimap允许容器中有重复key值元素

算法

遍历算法

//第一种遍历方式:
	while (pBegin != pEnd) {
		cout << *pBegin << endl;
		pBegin++;
	}

	
	//第二种遍历方式:
	for (vector<int>::iterator it = v.begin(); it != v.end(); it++) {
		cout << *it << endl;
	}
	//可以使用auto来代替,他会自动识别迭代器的类型
	
	cout << endl;

	//第三种遍历方式:
	//使用STL提供标准遍历算法  头文件 algorithm
	for_each(v.begin(), v.end(), MyPrint);
}

遍历过程中删除元素

for(auto i=vector.begin();i!=vector.end();i++){
		erase(i);
}

这样会发生指针异常,把这个数据删除了,再+1就不一定是vector中对应的下一个元素了

for(auto i=vector.begin();i!=vector.end();){
		int j=i++;
		erase(i);
		i=j;
}

即便是这样也不行

正确方法:

for(auto i=vector.begin();i!=vector.end();){
		i=erase(i);
}

sort算法

  • sort(iterator beg, iterator end, _Pred);

    // 按值查找元素,找到返回指定位置迭代器,找不到返回结束迭代器位置

    // beg 开始迭代器

    // end 结束迭代器

    // _Pred 谓词,自己写的一个bool函数

本站无任何商业行为
个人在线分享 » 【C++】C++初、中级语法速成(基于Java解释)
E-->