输入
- 输入完毕先按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)

本文介绍了C++中数据结构和算法的应用,包括输入输出、预编译、类型推导,深入探讨了容器的使用、哈希容器、指针和数组参数。详细讲解了动态规划、背包问题和有向无环图(DAG)动态规划,结合实例阐述了如何解决实际问题。还提到了DFS、BFS等图论算法和回溯法,并提供了优化技巧。
最低0.47元/天 解锁文章
9万+

被折叠的 条评论
为什么被折叠?



