c++语法
1.万能头#include<bits/stdc++.h>
2.命名空间namespace
namespace准确来说是防止重名,而对某些变量,函数的修饰,因为它并不是物理储存结构,而是编译时的二进制修饰。不恰当的类比:int x;struct x{int x;};这两个语句不冲突,但是去掉struct 就重名了。
namespace性质
基本用法:
namespace S{
}括号里面放函数,变量等
嵌套
命名空间可以嵌套
namespace Outer { namespace Inner { void Func() { } }
在一个文件里面,如果有全局
访问:Outer::Inner::Func();
可多次使用
访问
完全限定名:std::cout
只用当前一次
using声明:using std::cout;
用一个,输入该命令后全域都可以使用
using指令:using namespace std;
命名空间导入
namespace变量性质
当前文件修改namespace里面的变量会生效,但是不会影响到下一次编译
在某处引入using namespace A或者using A::...,只会在当前作用域生效
至此,using namespace std是什么已经很清楚了,注意std权限是可读,无法修改cout等函数,假设用hexedit修改源码,会造成编译立即崩溃
3.引用
int func(int &a){}
表示a按照传引用 传递,也就是外面的值可以像用指针那样改变
后面a正常用,不要当成指针*a用。
4.头文件细微变化
多头文件#include<iostream>
而c头文件可以正常用,但是推荐去掉.h,前面加c,比如<stdio.h> ---> <cstdio>
5.迭代器
迭代器是 C++ STL 提供的一种泛型指针,这种数据类型用于检查和遍历容器内元素,理解为指针即可
begin和end
begin()指向容器的第一个元素,注意!end()指向容器的最后一个元素的后一个元素!end通常作为未查找到的返回值
声明
vector <int>::iterator it;
for(set <int>::iterator it=dict.begin();it!=dict.end();++it)
cout<<*it<<"\n";
种类
1.随机访问迭代器 :
功能最全,支持解引用,成员访问,自增自减,迭代器加减,迭代器距离,比较,下标。和数组指针几乎一样
vector,deque容器支持
如
vector<int>::iterator it = v.begin(); cout << *it << endl; // 输出第一个元素 cout << *(it + 3) << endl; // 输出第四个元素 it += 2; // 跳跃到第3个元素 cout << *it << endl; // 输出 cout << (v.end() - v.begin()) << endl; // 元素个数 cout << it[1] << endl; // 相当于 *(it + 1)
2.双向迭代器:
比随机访问迭代器更弱一点,不支持迭代器位置比较it_1<it_2,和随即跳转it+n
list,set,map是双向
3.前向迭代器 多次读写,单向,输出迭代器,只写一次,单向,输入迭代器,只读一次,单向。很少用。
注意
比如vector容器,动态扩容之后会重新找一块更大的空间,所以原来的迭代器会失效
迭代器辅助函数
辅助函数可用于各种迭代器,通常用于写模板或泛型代码
#include<algorithm>
advance(it,n);使得迭代器向前/后移动n,(随即迭代器里的it+=n;)
distance(it2,it1);计算两个迭代器之间距离,即元素个数。it2要<=it1
iter_swap(it1,it2);交换迭代器指向的值
stringstream
1.介绍
用于处理字符串的输入输出流。从string里面读入
c++里面,流是数据从一个对象到另一个对象的流动。数据输入输出通过IO流实现,cin/cout是istream,ostream创建的对象(cin,cout是抽象实现,不能创建和拷贝,但是可以引用,istream & _cin=cin对,istream _cin=cin和istream _cin都错。 而stringstream不是抽象类,可以直接创建)
2.创建(一般来说创建名为ss)
a.直接创建
string arr("hello world");
stringstream ss;
ss<< arr;
cout <<ss.str()<<endl;
b.初始化创建
stringsream ss("hello world");
3.输出
调用ss.str();不能直接输出ss
4.修改流
ss.str("fuck world")
5.常见用法
string line,wold;
while(getline(cin,line)){
stringstream ss(line)
while(ss>>word)...
}
auto
自动推导类型
如auto x=6---x为int
auto x=arr.size();---x为size_t
6.结构体的构造法
a.默认构造Matrix(){v=0;h=0;}
b.参数化构造Matrix(int a,int b){v=a;h=b;}
初始化列表Matrix(int a,int b):v(a),h(b){}
值得注意的是,当使用参数构造的时候,想直接Matrix arr是不行的,得Matrix arr(1,2),若想直接声明,必须加上默认构造Matrix():v(0),h(0){}
7.cin.ignore()
首先我们知道cin会跳过整数前面的空白符,他们不会留在缓冲区中。但是最后一个整数后面的空白符不会被忽略。所以有时候我们cin读入整数后,后面再用getline会读到整数后面的换行符,从而导致错误。此时我们可以用getchar()吃掉换行符或者用cin.ignore函数。
istream & ignore(int n =1, int delim = EOF);
该函数的作用是跳过输入流中的 n 个字符,或跳过 delim 及其之前的所有字符,哪个条件先满足就按哪个执行。两个参数都有默认值,因此 cin.ignore() 就等效于 cin.ignore(1, EOF), 即跳过一个字符。

浙公网安备 33010602011771号