数据结构之算法入门经典

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

输入

  1. 输入完毕先按enter,再按ctrl+z,最后按enter,即可结束输入。
int x;
while(scanf("%d",&x)==1)
{
    
	//程序
}
  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]

数组和字符串

  1. memcpy(b,a,sizeof(int)*k);//从a复制k个元素到b
  2. 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的和。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值