STL 线代

选择函数

简单多态函数

  • max(x,y)
  • min(x,y)
  • swap(x,y)
  • iter_swap(x,y)

迭代范围内操作

  • binary_search(begin, end, value):若迭代返回内包含指定 value,返回true
  • copy(begin, start, out):将指定迭代范围内值拷贝给out 开始的迭代器
  • count(begin, end, value):返回迭代范围内与指定value 值相等的数目
  • fill(begin, end, value):将指定迭代范围内元素值置为 value
  • find(begin, end, value):返回指定范围内首个与value值 相同的元素的迭代器,不存在则结束
  • merge(begin_1, end_2, begin_2, end_2, out):将两个有序 子序列合并为一个以out开始的完整有序序列
  • inplace_merge(begin, middle, end):合并同一个集合内的 两个子序列
  • min_element(begin, end):返回指向迭代范围中最小元素的 迭代器
  • max_element(begin, end):返回指向迭代范围中最大元素的 迭代器
  • random_shuffle(begin, end):随机重排迭代范围中的元素
  • replace(begin, end, old, new):将迭代范围中的所有old 替换为new
  • reverse(begin, end):逆序指定迭代范围中元素
  • sort(begin, end):将迭代范围中元素升序排列

包含函数参数

  • 函数参数可以是函数对象、函数指针
  • for_each(begin, end, fn):对迭代范围中每个元素调用fn
  • count_if (begin, end, pred):计算迭代范围内pred返回 true数目
  • replace_if(begin, end, pred):将迭代范围内pred返回 true所有值替换为new
  • partition(begin, end, pred):将所有pred返回true 元素放在开头,返回指向边界的迭代器

集合类

Vector

Vector类提供了类似数组功能的机制,并对C++中数组做出了改进

  • 数组参见cppc/mem_ctl

API

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Vector<int> vec;
// 创建Vector对象
Vector<int> vec(VEC_LEN);
// 创建确定长度Vector对象长度,并将值初始化为0

vec.add(10);
// 在Vector对象里面添加新元素
vec.insert(2, 30);
// 向Vector对象中index=2插入元素
vec.remove(0)
// 删除Vector对象中index=0处元素
vec.set(3, 70)
vec[3] = 70
// 改变Vector对象中index=3处元素
// `[]`方法简短、和数组操作更相似,Vector被设计模仿

构造函数

  • Vector<type>()
  • Vector<type>(n, value):创建含有n个对象Vector元素, 每个元素都被初始化为value,缺省为相应类型默认值

方法

  • .size()
  • .isEmpty()
  • .get(index)
  • .set(index, valu)
  • .add(value)
  • .insertAt(index, value)
  • .removeAt(index)
  • .clear()

操作符

  • [index]
  • v1 + v2:连接两个Vector,返回包含所有元素的Vector
  • v1 += e1:向Vector尾部添加元素

注意

参数传递Vector对象

1
2
3
4
5
6
7
8
9
void print_vector(Vector<int> & vec){
cout << "[";
for (int i=0; i<vec.size(); i++){
if (i>0)
count << ",";
count << vec[i];
}
count << "]" << endl;
}

二维结构

1
2
Vector< Vector<int> > sodok(9, Vector<int>(9))
// 内部`Vector<int>`两侧需要空格,否则`>>`被错误解析

Stack

API

构造函数

  • Stack<type>()

方法

  • .size()
  • .isEmpty()
  • .push(value)
  • .pop()
  • .peek():返回栈顶元素但不出栈
  • .clear()

Queue

API

构造函数

  • Queue<type>()

方法

  • .size()
  • .isEmpty()
  • .enqueue(value):将值添加到队尾
  • .dequeue():删除队首元素,并返回给调用者
  • .peek():返回队首元素但不将其熟队列中删除
  • .clear()

Map

API

构造函数

  • Map<key_type, value_type>()

方法

  • .size()
  • .isEmpty()
  • .put(key, value)
  • .get(key):返回Map对象中当前与键key相关联的值
    • 若该键没有定义,get创建新的键值对,设置值为默认值
  • .remove(key)
  • .containsKey(key)
  • .clear()

操作符

  • map[key]:同get方法

Set

API

构造函数

  • Set<type>()

方法

  • .size()
  • .isEmpty()
  • .add(value)
  • .remove(value)
  • .contains(value)
  • .clear()
  • .isSubsetof(set)
  • .first()

操作符

  • s1 + s2:返回两集合并运算结果
  • s1 * s2:交
  • s1 - s2:差
  • s1 += s2
  • s1 -= s2
  • s1 *= s2

C++函数式编程

<functional>

基类

  • binary_function<arg_type1, arg_type2, result_type>: 两个指定类型参数、返回指定类型的函数类的父类
  • unary_function<arg_type, result_type>:指定类型参数、 返回指定类型的函数类的父类

实现算数操作符类

  • plus<arg_type>+
  • minus<arg_type>-
  • multiples<arg_type>*
  • divides<arg_type>/
  • modulus<arg_type>%
  • negate<arg_type>-取反

实现比较操作

  • equal_to<arg_type>==
  • not_equal_to<arg_type>!=
  • less<arg_type><
  • less_equal<arg_type><=
  • greater<arg_type>>
  • greater_equal<arg_type>>=

实现逻辑关系

  • logical_and<arg_type>&&
  • logical_or<arg_type>||
  • logical_not<arg_type>!

产生函数对象

  • bind1st(fn, value):返回新一元函数对象,用与其绑定的 value作为首个参数调用二元函数对象fn
  • bind2nd(fn, value):返回新一元函数对象,用与其绑定的 value作为第二个参数调用二元函数对象fn
  • not1(fn):返回新函数对象,且该函数对象为一元函数对象 时返回true
  • not2(fn):返回新函数对象,且该函数对象为二元函数对象 时返回true
  • ptr_fun(fnptr):返回需要调用特定函数指针的新函数对象, 可能需要一个或两个同类型参数
    • 返回具有相同效果的函数对象,可以使得函数指针、 函数对象概念一体化,避免代码重复

1
2
3
4
5
6
7
8
count_if(v.begin(), v.end(), bind2nd(less<int>(), 0));
// 返回元素类型为整形的矢量对象`v`中负数数量
template<typename FunctionClass>
void func_func(FunctionClass fn);
void func_func(double (*fn)(double)){
// 函数重载+`ptr_fun`减少代码重复
func_func(ptr_func(fn));
}

STL String

字符串:理论上是指特定字符序列

  • 声明string类型变量时,一般赋予字符串字面值作为初始值
  • 字符串长短、索引类型默认是size_t类型,在<string>类库 中已经定义

<string>

操作

  • +
  • +=
  • ==
  • !=
  • <
  • <=
  • >
  • >=

读字符串内容

  • .length()
  • .at(k):返回值可以用于赋值
  • .substr(pos, n)
  • .compare(str)
  • .find(pattern, pos)

修改接收方字符串内容

  • .erase(pos, n)
  • .insert(pos, str)
  • .replace(pos, n, str)

C风格

  • string(carray)
  • string(n, ch)
  • .c_str()

STL 迭代

字符串、字符处理

<cctype>

检验字符类型

  • isalpha(ch)
  • isupper(ch)
  • islower(ch)
  • isdigit(ch)
  • isxdigit(ch)
  • isalnum(ch)
  • ispunct(ch)
  • isspace(ch)
  • isprint(ch)

大小写转换

  • toupper(ch)
  • tolower(ch)

I/O