C++功能强大、特性丰富,但总有一些语法、函数在偶尔用到的时候记不住需要现查,频繁打断工作流颇为恼人,在这里做一些记录,希望能加强记忆、提高效率。
ltrim与rtrim
C++没有提供原生的字符串trim
方法,但是可以用stl库里的方法快速实现ltrim
与rtrim
:
1 | inline void ltrim(std::string &s) |
std::vector的构造函数
构造有n
个值为val
的元素的vector
的构造函数为:
1 | vector(size_t count, const T& value); |
数量在前,值在后。可以可以记忆中文语法里惯用的“多少个什么”(“三个苹果”)来记住参数的顺序。
如果想构造一个只有一个元素的vector
,就不要用上面那个构造函数了,vector
也是可以用初始化列表的!
1 | vector<string> strs{string("yayaya")}; |
有用的<cctype>
cctype
头文件中提供了大量有关字符的工具函数:isspace
, isalpha
, isdigit
, isalnum
, tolower
, isuppe
,要用这些函数时无需自己编写。
std::map的增强型for循环
std::map
的基本单元为std::pair
,其增强型for循环应这样写:
1 | map<int, char> int2str = { |
基于迭代器的普通for循环亦参照此。
stringstream
使用std::stringstream
需要包含头文件<sstream>
。
1 |
可以使用默认构造或者字符串构造。
1 | std::stringstream ss; |
使用str()
方法获取流中的字符串内容。
使用clear()
方法清空流。
可以对std::string
进行流插入。
格式化字符串
在C++20
中,std
库终于提供了生成格式化std::string
对象的方法std::format
!
1 | std::string formatString(int number, const std::string& text) { |
std::format
中不能使用%d
%c
这样的格式控制符,因此另附std::format
的格式控制符表:
{}: 默认格式化(适用于大多数类型)
{0}: 按照索引格式化(支持多参数时指定)
{:d}: 格式化为整数
{:f}: 格式化为浮点数
{:s}: 格式化为字符串
{:x}: 格式化为十六进制整数
{:X}: 格式化为十六进制整数(大写)
{:e}: 格式化为科学记数法
{:c}: 格式化为字符
{:>width}: 右对齐,宽度为 width
{:<width}: 左对齐,宽度为 width
{:^width}: 居中对齐,宽度为 width
{:0width}: 用零填充空白部分,宽度为 width
类模板的实现不与声明分离
在以往的C++实践中,写类时已经习惯了.h
里成员函数的声明,.cpp
里写成员函数的实现,但是这对类模板并不适用,类模板成员函数的实现也内联在.h
中,否则需要在.cpp
文件的末尾显式地实例化要用的模板,否则报undefined reference
。
向std::vector中填充元素
在向各种STL容器中填充元素时可以使用std:fill
方法,其原型为:
1 | void std::fill(iterator __first, iterator __last, ... &__value); |
而std::vector
独有assign()
方法:
1 | void std::vector::assign(size_t count, const T& value); |
另甚至有生成器方法:
1 | std::generate(RandomAccessIterator first, RandomAccessIterator last, Generator&& gen); |
顺带一提,什么最大值最小值的方法也是有的,当然也能自己附加比较器。
1 | template<class ForwardIterator> |
在以往的C++实践中,写类时已经习惯了.h
里成员函数的声明,.cpp
里写成员函数的实现,但是这对类模板并不适用,类模板成员函数的实现也内联在.h
中,否则需要在.cpp
文件的末尾显式地实例化要用的模板,否则编译报undefined reference
。
平台无关的固定位数整数
要定义平台无关的固定位数整数,通常使用uint64_t
int32_t
等,这些类型定义在头文件<cstdint>
中。