数据类型
布尔类型 bool,取值为true/false
字符串类型 string
实例:输入数据的每行包含若干个(至少一个)以空格隔开的整数,输出每行中所有整数之和。
#include<iostream>
#include<string>
#include<sstream>
using namespace std;
int main() {
string line;
while(getline(cin, line)) {
int sum = 0, x;
stringstream ss(line); //可以把string作为流进行读写,定义在sstream头文件中。
while(ss >> x) sum += x;
cout << sum << "\n";
}
return 0;
}
结构体struct 和 类class
C++不再需要用typedef的方式定义一个struct,而且在struct里除了可以有变量(称为成员变量)之外还可以有函数(称为成员函数)。
例:
struct Point //定义点 (x,y)
{
int x, y;
Point(int x=0, int y=0):x(x),y(y) {}
};
Point operator + (const Point& A,const Point& B) //定义运算符
{
return Point(A.x+B.x, A.y+B.y);
}
STL(Standard Template Library)
<algorithm>——常用函数
sort 排序
sort(a,a+n); //排序
sort(a,a+n,cmp)
sort可以对任意对象进行排序,不一定是内置类型。
如果希望用sort排序,这个类型需要定义“小于”运算符,或者在排序时传入一个“小于”函数。
lower_bound 二分查找
int p = lower_bound(a, a+n, x) - a; //在已排序数组a中寻找x
unique 去重(离散化)
//删除有序数组中的重复元素,返回去重后元素个数
int m = unique(arr, arr+n)-arr;
<vector>
vector是一个模板类,所以需要用vector<int> a或者vector<double> b这样的方式来声明一个vector。
clear( )清空
resize( )改变大小
push_back( )、pop_back( )在尾部添加和删除元素
empty( )测试是否为空
vector之间可以直接赋值或者作为函数的返回值,前面的sort、lower_bound、unique同样可以用在vector上
典型应用:图论存边(邻接表)
<set>集合
set就是数学上的集合——每个元素最多只出现一次。
和sort一样,自定义类型也可以构造set,但同样必须定义“小于”运算符。
insert()在集合中插入元素
erase()删除集合中的元素
set_union 求两个集合的并集
set_intersection 求两个集合的交集
find()返回一个指向被查找到元素的迭代器
<map>映射
map就是从键(key)到值(value)的映射。因为重载了[ ]运算符,map像是数组的“高级版”。例如可以用一个map<string,int>month_name来表示“月份名字到月份编号”的映射,然后用month_name[“July”]=7这样的方式来赋值。
insert
find
count
remove
<stack>栈
所谓栈,就是符合“后进先出”(Last In First Out,LIFO)规则的数据结构,有PUSH和POP两种操作,其中PUSH把元素压入“栈顶”,而POP从栈顶把元素“弹出”。
<queue>队列
队列是符合“先进先出”(First In First Out,FIFO)原则的“公平队列”
STL的queue头文件提供了队列,用“queues”方式定义,用push( )和pop( )进行元素的入队和出队操作,front( )取队首元素(但不删除)
<deque>双端队列
可以在头部和尾部进出
pop_back(), pop_front
push_back(), push_front()
<priority_queue>优先队列
优先队列是一种抽象数据类型(Abstract Data Type,ADT),行为有些像队列,但先出队列的元素不是先进队列的元素,而是队列中优先级最高的元素。
STL的优先队列也定义在头文件里,用“priority_queuepq”来声明。这个pq是一个“越小的整数优先级越低的优先队列”。由于出队元素并不是最先进队的元素,出队的方法由queue的front( )变为了top( )。
自定义类型也可以组成优先队列,但必须为每个元素定义一个优先级。
priority_queue<int,vector,cmp>pq
对于一些常见的优先队列,STL提供了更为简单的定义方法,例如,“越小的整数优先级越大的优先队列”可以写成“priority_queue<int,vector,greater >pq”。
注意,最后两个“>”符号不要写在一起,否则会被很多(但不是所有)编译器误认为是“>>”运算符。
引用传参
比指针方便且不容易出错
#include<iostream>
using namespace std;
//不命名为swap的原因是algorithm这个头文件里已经提供过了swap,可以直接使用,并且功能十分强大
void swap2(int& a, int& b)
{
int t = a; a = b; b = t;
}
int main()
{
int a = 3, b = 4;
swap2(a, b);
cout << a << " " << b << "\n";
return 0;
}