赞
踩
[[noreturn]] //属性标签,函数绝不会返回任何值
int func(bool flag)
{
throw std::rutime_error("xxx");
}
C++14新增属性:deprecated(废弃某段代码,不鼓励使用)
C++17/20新增属性:
非标准扩展属性(GCC):
[[gnu::constructor]]
void first_func(){
printf("before main()\n");
}
static_assert(is_integral_v<T>); //断言T是整数类型
static_assert(is_pointer_v<T>); //断言T时指针类型
static_assert(is_default_constructible_v<T>); //断言T有默认构造
class DemoClass{
puublic:
operator bool(){...}//转型为bool
};
class DemoClass{
puublic:
static const int x = 10;
//static std::string prefix = "xxx"; //无法通过编译
inline static std::string prefix = “xxx”; //C++17编译正常
};
auto str = "xxx"s;
的形式直接推导出std::string类型。auto str = "hello";
auto str1 = "hello"s;
tuple x{1,"x"s,0.1};
auto [a,b,c] = x;//结构化绑定,x中的值分别赋值给a,b,c
std::map<int,std::string> map = {{1,"abc"s},{2,"qwe"s}};
for(auto& [k,v] : map){
std::cout << k << "=>" << v << std::endl;
}
//如要获取实时温度时需要连续赋值
int a = 1;
a = 2;
a = 3; //编译器优化后为 a = 3;
volatile int a = 1;
a = 2;
a = 3; // 不优化
void some_function()//函数名之后直接写try块
try{
//函数体
...
}
catch(...){
... //catch块与函数体同级并列
}
auto f = []<typename T>(const T& x){
static_assert(is_integral_v<T>);
return x + x;
}
inline namespace tmp{
auto x = 0L;
auto str = "hello";
}
cout << x << endl. //可以直接使用内部成员,不需要空间限定
cout << tmp::str << end;//也可加名字空间
namespace a::b::c::{
...
}
if(init;cond){
}
vector<int> v{1,2,3};
if(auto pos = v.end();!v.empty()){
}
//多线程编程锁定互斥量
if(scoped_lock g;tasks.empty()){
}
auto x = 0b11010010;
auto x = 010; //八进制
auto a = 0b1011'0101;
weak_ptr的另一个用途——让类正确的自我创建shared_ptr:对象内部用weak_ptr来保管this指针,然后调用lock()获取shared_ptr();
class SharedSelf final : public std::enable_shared_from_this<SharedSelf>{
};
auto ptr1 = make_shared<SharedSelf>(); //调用工厂函数创建智能指针
assert(ptr1.use_count() == 1);
auto ptr2 = ptr1->shared_from_this(); //正确获得共享指针
assert(ptr2.use_count() == 1);
auto ptr3 = ptr1->weak_from_this(); //也可以获得弱指针
assert(ptr3.use_count() == 1);
auto str = R"(nier:automata)";
auto str = R"==(R"(xxx)")=="; //原样输出R"(xxx)"
using namespace std::literals;
auto sv3 = "view it"sv;
string_view sv {"god of war"s};
assert(sv.substr(4,2) == of); //取子串
sv.remove_prefix(3); //删除前缀
assert(sv == " of war");
sv.remove_suffix(4); //删除后缀
assert(sv == " of");
< : 数据左对齐 > : 数据右对齐 + : 为数字添加正负号标记 - : 为数字添加正“-”标记,正数无标记 空格:为数字添加正“-”标记,正数前加空格 //? b : 格式化二进制整数 d : 格式化十进制整数 o : 格式化八进制整数 x/X : 格式化十六进制整数 # : 非十进制数字显示“0b” “0o” “0x”前缀 数字: 格式化输出的宽度 format("{:>10}", "hello"); //右对齐,10个字符的宽度 format("{:04}, {:+04}", 100L,88); //指定填充和宽度,默认是十进制 format("{0:x}, {0:#X}",100L); //格式化为十六进制 format("{:04o}, {:04b}",7,5); //格式化为八进制/二进制,宽度是4 format("{{xxx}}"); //输出 hello 0100, +088 64, 0X64 0007, 0101 {xxx}
正则表达式主要用到两个类regex和smatch。
创建正则表达式的时候可以传递一些特殊标志,用于控制正则的处理过程。这些标志位于名字空间std::regex_constantes中,如:
using namespace std::regex_constants;
regex reg1{"xyz",icase | oprimize}; //忽略大小写且尽量优化
regex_match的三个参数重载形式中,第二个参数存储匹配结果,匹配结果中第0号元素是整个匹配串,其他的则是子表达式匹配串。(子表达式就是正则表达式中”()“括起的部分)。regex_match匹配的时候需要注意,如果想要获取捕获结果,那么目标字符串不能是临时对象,因为匹配结果需要引用字符串,而临时变量在函数调用后就消失了,会导致引用无效。
$N 引用匹配的子表达式,N表示子表达式的序号
$& 引用整个匹配结果
示例:
std::cout << std::regex_replace("hello mike",std::regex(R"((\w+)\s(\w+))"),"$2-says-$1($&)"); //mike-says-hello(hello mike)
定义容器的时候必须要指定key的比较函数。这个函数通常默认为less,表示小于关系。
template<
class key,
class Compare = std::less<key>
> class set;
template<
class key,
class T,
class Compare = std::less<key>
> class map;
自定义类型不支持比较函数,作为容器的key时需要重载比较操作符“<”,或者自定义模板参数。
auto comp = [](auto&& a,auto&& b){
return a > b;
};
set<int,decltype(comp)> gs(copm);
应用场合:如果要求实时插入排序,选择set或map,否则选择vector,全部数据掺入完成后再一次性排序。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。