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), 即跳过一个字符。

posted @ 2025-07-24 16:32  hardestnut  阅读(7)  评论(0)    收藏  举报