面试之C++17

在这里插入图片描述

结构化绑定(Structured binding declarations)

可以绑定pair,tuple,数组,结构体,结构化绑定以后也可以修改原值,也可以使自定义类型支持结构化绑定,但是要修改std,感觉没什么必要。

std::tuple<int, double> func_two() {
    
    
    return std::tuple(1, 2.2);
}

auto[i, d] = func_two();
cout << i << " " << d << endl;

map<int, string> mp = {
    
    
  {
    
    0, "a"},
  {
    
    1, "b"},
};

for(const auto& [x, y] : mp){
    
    
  cout << x << " " << y << endl;
}

pair pa(4, string("hihi"));
auto&[x, y] = pa;
cout << x << " " << y << endl;

输出:
1 2.2
0 a
1 b
4 hihi

/*      
vector vec = {1,2,3};
auto&[xx, yy, zz] = vec;
cout << xx << endl; 
*/ vector当然不能使用结构化绑定啦

if-switch语句初始化(Initializers in if and switch statements)

变量的作用域划分的更明显了。

if (int a = 29; a < 101) {
    
    
    cout << a;
}

std::any

一般顶多variant就足够用了,何必用Any呢 但在极端情况下,用any总比用void*强得多,鼓励实现避免小对象的动态分配

std::any a = 1;
cout << a.type().name() << " " << std::any_cast<int>(a) << endl;
a = 2.2f;
cout << a.type().name() << " " << std::any_cast<float>(a) << endl;
if (a.has_value()) {
    
    
    cout << a.type().name() << std::endl;
}
a.reset();
// 可以这样判断类型
// assert(a1.type() == typeid(int));
if (a.has_value()) {
    
    
    cout << a.type().name() << std::endl;
}
a = std::string("a");
// 这个string的类型名是真的恶心
cout << a.type().name() << ": " << std::any_cast<std::string>(a) << endl;

输出:
i 1
f 2.2
f
NSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE: a

std::optional

具体可参考《C++干货系列——C++17新特性之std::optional

其实就是为了防止我们平时在代码中返回一个不存在语义时随便设置的magic number。

std::variant

具体可参考《C++17之std::variant

struct NoDefConstr_seven{
    
    
    NoDefConstr_seven(int i){
    
    
        std::cout << "NoDefConstr::NoDefConstr(int) called\n";
    }
};
// variant类似于union,第一个参数必须拥有默认构造函数

std::variant<int, std::string> var{
    
    "hi"}; // initialized with string alternative
std::cout << var.index() << std::endl; // prints 1
var = 42; // now holds int alternative
std::cout << var.index() << std::endl; // prints 0
try {
    
    
  std::string s = std::get<std::string>(var); // access by type
  int i = std::get<0>(var); // access by index
}
catch (const std::bad_variant_access& e) {
    
     // in case a wrong type/index is used
  std::cout << "hello\n";
}

// std::variant<NoDefConstr_seven, int> v1; 第一个参数没有构造函数 编译失败
// std::monostate就是防止全部的参数都没有默认构造函数
std::variant<std::monostate, NoDefConstr_seven, int> v2;

输出:
1
0
hello

具体可查看这篇文章《C++17之std::any

std::string_view

平时代码中可以大规模使用的一个特性。其实对于string的争论一直没有停止过,很多人认为string是字节串而不是字符串,因为string是可以改变的,这一切争论到C++17可以停止了。string_view的substr与构造时间复杂度为O(1),且不会产生拷贝,因为substr只是一个指针操作。

并行算法库(Parallel algorithm of the STL)

这可以说是C++17最重要的几个特性之一,这个特性为几乎所有标准库函数加上一个执行策略参数,可以让使用者选择并行还是串行,这不仅包括七个新的算法,还有我们熟知的sort等。

std::shared_mutex

千盼万盼你终于是来了。。这个不需要解释了,就是读写锁了。

具体内容可参考:《C++ std::shared_mutex读写锁》

std::file_system

具体可参考《c++ filesystem

这其实模子是boost的file_system,最早2003年就出来了,因为是跨平台的,所以可以说是非常舒服了。

namespace fs = std::filesystem;
fs::path pathToShow("/home/lzl/Desktop/execise");
cout << "exists() = " << fs::exists(pathToShow) << "\n"
<< "root_name() = " << pathToShow.root_name() << "\n"
<< "root_path() = " << pathToShow.root_path() << "\n";

猜你喜欢

转载自blog.csdn.net/xp178171640/article/details/118104751