首页
社区
课程
招聘
[分享]《探索现代化C++》泛读笔记摘要6
发表于: 2022-9-12 09:17 4407

[分享]《探索现代化C++》泛读笔记摘要6

2022-9-12 09:17
4407

《探索现代化C++》泛读笔记摘要6

Chapter 3 通用编程

命名空间和函数查找

在头文件中建议不要引入名字或在函数外引入命名空间。

 

命名空间也可以有别名

1
2
namespace lname = long_namespace_name;
namespace dvector = algebra::vector::dense;

C++17 支持打开嵌套的命名空间

1
2
3
namespace algebra::vector::dense{
    class vector3 {/* */};
}

ADL 依赖于参数的查询。

类模板

对于像指针一样的对象,C++提供了像指针一样的接口,从而巧妙地构思出来了迭代器。

类型推导和定义

C++11 自动变量类型 auto

1
auto a = f(g(x,y,z)+3*x);

C++11 表达式的类型 decltype

1
decltype(f(g(x,y,z)+3*x)) a = f(g(x,y,z)+3*x);

C++11 decltype(auto)

1
2
decltype(expr) v = expr; // 当表达式很长时,写这种语句就显得比较冗余
decltype(auto) v = expr; // 这种形式简化了书写

例子

1
2
3
4
5
6
7
8
int main()
{
    using Vec = vector<double>;
    Vec v = {2.3,8.1,9.2};
 
    value_range_vector<Vec> w{v,1.0,10.0};
    decltype(auto) val = w[1];
}

C++17 推导类模板参数

1
2
tuple<int,float,string> t1(3,3.2f,"text"s); // C++17 以前的写法
tuple t2(3,3.2f,"text"s); // c++17 自动完成了类模板的推导

有些时候我们可以提供默认类型

1
2
template<typename Value = double>
struct vec;

或者提供推导指南帮助编译器

1
vec(unsigned s) -> vec<double>;

C++17 推导多种类型, 使得函数能返回多个值。

 

当函数返回值是多个结果,比如说pair,tuple,或者用户定义的类时,就会出现这种情况。

1
2
3
4
5
6
7
auto lu(const matrix& A)
{
    // ... some computations
    return tuple<matrix,vector>(LU,p);
}
 
auto [Lu, p] = lu(A);

第二个例子 map

1
2
3
4
5
6
map<string,int> numbers = {{"Zeros",0},{"One",1},{"Two",2}};
for( const auto&[key,value] : numbers)
    cout<<key<<"->"<<value<<endl;
 
for(auto& [key,values]:numbers)
    cout<<key<<"->"<<value<<endl;

第三个例子 用户自定义的类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
struct lu_result
{
    matrix LU;
    vector p;
};
 
auto lu(const matrix& A)
{
    // ...
    return lu_result{LU,p};
}
 
matrix A; // set A ...
auto [Lu,p] = lu(A);

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

最后于 2022-9-12 22:05 被VirtualCC编辑 ,原因: 章节错误
收藏
免费 0
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回
//