C++ 字符串和数字相互转换
字符串转数字std::strtol & std::strtoll & std::strtoul & std::strtoull函数原型#include <cstdlib>long strtol( const char *str, char **str_end, int base );long long strtoll( const char *str, char **str_end, int base );unsigned long strtoul( const char *str, char **str_end, int base );unsigned long long strtoull( const char *str, char **str_end, int base );
#include <cwchar>long wcstol( const wchar_t* str, wchar_t** str_end, int base );long long wcstoll( const wchar_t* ...
Boost date_time
GregorianDateConstruction
Sytax
Description
Example
date(greg_year, greg_month, greg_day)
从日期的一部分构造,如果年、月或日超出范围,则抛出 bad_year, bad_day_of_month, bad_day_month
date d(200, Jan, 10);
date(date d)
拷贝构造函数
date d1(d);
date(special_values sv)
构造无限日期时间,非日期时间,最大最小日期时间
`date d1(neg_infin);``date d2(pos_infin);``date d3(not_a_date_time);``date d4(max_date_time);``date d5(min_date_time);`
date()
默认构造函数,初始化为 not_a_date_time,可以通过定义 DATE_TIME_NO_DEFAULT_CONSTRUCTOR 来禁用此构造函数
date d; // d => not_ ...
Boost string algorithm
Apisboost/algorithm/string/case_conv.hpp
to_lower()
to_lower_copy()
to_upper()
to_upper_copy()
boost/algorithm/string/predicate.hpp
starts_with()
istarts_with()
ends_with()
iends_with()
contains()
icontains()
equals()
iequals()
lexicographical_compare()
ilexicographical_compare()
all()
boost/algorithm/string/classification.hpp
is_classified()
is_space()
is_alnum()
is_alpha()
is_cntrl()
is_digit()
is_graph()
is_lower()
is_print()
is_punct()
is_upper()
is_xdigit()
boost/algorithm/string/trim.hp ...
Boost cmake set
find_packagefind_package(Boost [version] [EXACT] # Minimum or EXACT version e.g. 1.67.0 [REQUIRED] # Fail with error if Boost is not found [COMPONENTS <libs>...] # Boost libraries by their canonical name # e.g. "date_time" for "libboost_date_time" [OPTIONAL_COMPONENTS <libs>...] # Optional Boost libraries by their canonical name) ) # e.g. "date_time" for "libb ...
线程生命周期
原文链接:Threads Lifetime
首先感谢作者的分享,然后本文是要用 Google 翻译加上个人的理解进行翻译的,部分内容可能不正确,仅供参考,推荐阅读原文
父母必须照顾孩子。这个简单的想法对线程生存期有很大的影响。以下程序启动一个线程,该线程显示其ID。
// threadWithoutJoin.cpp#include <iostream>#include <thread>int main(){ std::thread t([]{std::cout << std::this_thread::get_id() << std::endl;});}
但是程序运行会导致意外结果。
是什么原因呢?
join and detach创建的线程 t 的生存期以其可调用单元结束。创建者有两种选择。第一:等待,直到其子项完成 (t.join())。第二:它将自己与孩子分离 (t.detach())。如果没有对线程调用 t.join() 或 t.detach(),则具有可调用单元的线程 t(可以创建 ...
Modern C++ 中的多线程
原文链接:Multithreading in Modern C++
首先感谢作者的分享,然后本文是要用 Google 翻译加上个人的理解进行翻译的,部分内容可能不正确,仅供参考,推荐阅读原文
伴随着新的 C++ 11 标准出现,C++ 首次面临多核体系结构的挑战。2011 年发布的标准定义了在存在多个线程的情况下 C++ 程序的行为方式。C++ 11 多线程的能力由两个组件组成。一个是定义的内存模型,另一个是标准化的线程接口。
定义明确的内存模型定义的内存模型是必要的基础,以便多线程编程在 C++ 中有意义。因此,内存模型必须给出以下问题的答案。
什么是原子操作?
确保怎样的操作顺序?
什么时候可以看到操作对内存的影响?
对于第 1 个问题:原子操作是遵循数据库理论中著名的 ACID 惯用语的前三个字母的操作。原子操作是原子的(A),从一个一致性(C)状态转到下一个一致性状态,并且是独立执行的(I)。这意味着没有其他线程可以观察到原子操作的中间状态。增量 atomVar++ 很好地显示了原子操作的一致性和隔离性。如果 atomVar 是原子变量,则 atomVar 只能具有 ...
C++ string_view
string_view 提供字符串的一个视图。使用 string_view 能够减少字符串的拷贝。
类
basic_string_view : 模板类
std::string_view : std::basic_string_view<char>
std::wstring_view : std::basic_string_view<wchar_t>
std::u8string_view : std::basic_string_view<char8_t>
std::u16string_view : std::basic_string_view<char16_t>
std::u32string_view : std::basic_string_view<char32_t>
可用标准库函数
std::begin()
std::end()
std::cbegin()
std::cend()
std::rbegin()
std::rend()
std::crbegin()
std::crend()
std::size()
std::s ...
C++ 17 filesystem
C++ 17 filesystemfilesystem 提供对路径、常规文件和目录的操作的库。有了该库,对于文件和目录的操作变得更加容易。
库相关的几个定义
file : 存放数据的文件系统对象,可读可写。拥有文件名字和属性。
directory : 文件目录
hard link : 硬链接
symbolic link : 符号链接
regular file : 常规文件
file name : 文件的名字,通常为一个字符串
path
absolute path : 绝对路径
canonical path : 规范路径(不包含符号链接,. 和 .. 的路径)
relative path : 相对路径(一个路径相对于另一个路径的路径,字符串中可能包含 . 和 ..)
Path 类及其相关内容路径的定义文件系统中对于路径名的定义包括以下几个部分
path name syntax
root-name : 根的名字,例如 C: 或 //myserver
root-directory : 根目录,将该路径标记为绝对路径的目录分隔符。
file-name : 文件名
direct ...
使用 VS2019 创建第一个 windows 程序
正在学习 windows 编程,记录一下笔记,方便以后查阅
创建 win32 桌面应用首先打开 vs2019,选择 创建新项目
然后在模板中选择 windows 桌面向导,再点击下一步
然后在配置项目页中填写上项目的名称,配置好项目路径,点击创建
然后会弹出 windows 桌面配置页面,这里选择空项目,然后点击确定
之后进入项目后,右键项目名,选择 添加 -> 新建项
然后选择文件类型为 c++文件 填写上项目的名称,并点击添加
之后拷贝官方的教程代码到创建的源文件中,执行程序,此时会出现一个错误
然后右键项目名,选择属性,修改链接器->系统->子系统为窗口
再次执行程序便可以展示一个窗口
STL 中 map 需要注意的地方
对于一个已经存在的 map,要想获取其中的某一组值有两种方法,一种是使用 at() 成员函数,另一种则是使用索引 []。接下来将对使用这两种方式时需要注意的事情进行说明。
使用 at() 获取使用 at() 获取 map 中的成员时,会对其键值做范围检测,如果 map 中不存在相应的键值,at() 会抛出异常。因此在使用 at() 获取 map 中的数据时,通常会将这部分代码放到 try ... catch ... 模块中。
#include <iostream>#include <string>#include <map>int main(){ std::map<std::string, int> student = { {"Xiao Ming", 10}, {"Xiao Hua", 15}, {"Xiao hong", 13} }; std::string name; ...