输入
- 输入完毕先按enter,再按ctrl+z,最后按enter,即可结束输入。
int x;
while(scanf("%d",&x)==1)
{
//程序
}
- 使用文件输入:
freopen("input.txt","r",stdin);
freopen("output.txt","w",stdout);
预编译
#define LOCAL
int main()
{
#ifdef LOCAL
freopen("input.txt","r",stdin);
freopen("output.txt","w",stdout);
#endif
//程序
}
类型推导
vector<int> vec;
vector<int>::iterator cit = vec.begin();
在C++11中可以写成:
vector<int> vec;
auto cit=vec.begin();
容器的for循环遍历
for(const auto&p: vec)
cout<<p<<endl;
初始化容器
C++98中需要一个个push_back,C++11中初始化容器:
vector<string> vec{
1,2,3};
map<string,string> dict{
{
"ABC","123"},{
"BCD","234"}};
哈希容器
当不需要元素排序时,可以尽量使用容器来获得更好的查找性能:
#include<unordered_map>
unordered_map<string,int> um{
{
"A",1972},{
"B",1976},
{
"C",1967},{
"D",1968}
};
um["E"]=1983;//添加
for(auto x:um)//迭代输出
cout<<x.first<<x.second;
指针参数
正确:
#include<stdio.h>
void swap(int* a,int* b)
{
int t=*a;*a=*b;*b=t;
}
int main()
{
int a=3,b=4;
swap(&a,&b);
return 0;
}
数组参数
错误:sizeof(a)无法得到数组大小,传入的是地址
int sum(int a[])
{
int ans=0;
for(int i=0;i<sizeof(a);i++)
ans+=a[i];
return ans;
}
正确:
int sum(int* a,int n)
{
int ans=0;
for(int i=0;i<n;i++)
ans+=a[i];
return ans;
}
sum(a+1,3);//a[1]+a[2]+a[3]
改进:
int sum(int *begin,int* end)
{
int n=end-begin;
int ans=0;
for(int i=0;i<n;i++)\
ans+=begin[i];
return ans;
}
sum(a+1,a+3);//a[1]+a[2]+a[3]
数组和字符串
- memcpy(b,a,sizeof(int)*k);//从a复制k个元素到b
- memset(a,0,sizeof(a));//把数组a清零
STL框架
const声明
使用const声明的数组长度,代替define。
行输入
虽然string和sstream都很方便,但string很慢,sstream更慢,谨慎使用。
#include<iostream>
#include<string>
#include<sstream>
using namespace std;
int main()
{
string line;
while(getline(cin,line)){
int sum=0,x;
stringstream ss(line);
while(ss>>x)
sum+=x;
cout<<sum<<"\n";
}
return 0;
}
结构体
struct Point{
int x,y;
Point(int x=0,int y=0):x(x),y(y){
}//构造函数
//Point(int x=0,int y=0){this->x=x;this->y=y;}
}
Point operator +(const Point& A,const Point& B){
return Point(A.x+B.x,A.y+B.y);
}
模板
int sum(int* begin,int* end){}
只能求int
的和,不能求double
的和。