首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

C++17中新特性

c++14中,auto关键字的能力进一步提升,能够通过return语句推导出函数的返回类型。 使用auto关键字能够提高编码效率,同时能够简化重构流程。...当我们通过函数创建一个对象时,通常使用通过函数返回错误码,而通过出参返回对象本身。...如果通过optional返回创建的实例,就会变得更加直观, std::optional 提供了下面几个方法: has_value() // 检查对象是否有值 value() // 返回对象的值...4. std::string_view string_view我最早使用的是boost版本的,c++17中的string_view 和 boost类似。...很多情况下,我们只是临时处理字符串,本不需要对原始字符串的一份拷贝。 使用string_view可以减少不必要的内存拷贝,可以提高程序性能。

4.9K30
您找到你想要的搜索结果了吗?
是的
没有找到

C++17 在业务代码中最好用的十个特性

处理子串时,std::string::substr也需要进行拷贝和分配内存,而std::string_view::substr则不需要,处理大文件解析时,性能优势非常明显。...T 被转换成void*时,T 的类型信息就已经丢失了,转换回具体类型时程序无法判断当前的void*的类型是否真的是 T,容易带来安全隐患。...常用于可能失败的函数的返回值中,比如工厂函数。 C++17 之前,往往使用T*作为返回值,如果为nullptr则代表函数失败,否则T*指向了真正的返回值。...但是这种写法模糊了所有权,函数的调用方无法确定是否应该接管T*的内存管理,而且T*可能为空的假设,如果忘记检查则会有 SegFault 的风险。...通过使用std::variant,用户可以实现类似 Rust 的std::result,即在函数执行成功时返回结果,失败时返回错误信息,上文的例子则可以改成: std::variant

2.5K20

C++17,使用 string_view 来避免复制

这次要介绍的 string_view 是 C++17 的一个主要特性....我假设你已经了解了一些 std::string_view 的知识,如果没有,可以看看我之前的这篇文章.C++ 中的 string 类型堆上存放自己的字符串数据,所以当你处理 string 类型的时候,...其实 string 类型只有字符串超过指定大小(具体实现相关)时才会申请(堆)内存,对于 MSVC 来说,指定大小为 15, 对于 GCC 和 Clang,这个值则为 23....O(n) versus O(1) std::string 和 std::string_view 都有 substr 方法, std::string 的 substr 方法返回的是字符串的子串,而 std...::string_view 的 substr 返回的则是字符串子串的"视图".听上去似乎两个方法功能上比较相似,但他们之间有一个非常大的差别: std::string::substr 是线性复杂度, std

97810

c++ string_view

C中指针是完成这一目的的标准数据结构,而C++引入了安全性更高的引用类型。所以C++中若传递的数据仅仅只读,const string&成了C++的天然的方式。...实际上我们本意并不是要改变原字符串,为什么不在原字符串基础上返回呢? C++17中引入了string_view,能很好的解决以上两个问题。...2.3 成员函数 下面列举其成员函数:忽略了函数的返回值,若函数有重载,括号内用...填充。这样可以对其有个整体轮廓。...好在这块内存空间有合法的字符串结尾符,如果str指向的是一个没有\0的字符数组,程序很有可能会出现内存问题,所以我们string_view类型的数据传入接收字符串的函数时要非常小心。...某些情况下,我们转为string_view可能仅仅是想用其中的一些函数,比如substr。

32220

C++ absl的Strings Library

C++17环境中你应该使用std::string_view非C++17环境中你应该使用absl::string_view。...一个string_view类型的变量可以被想象成一个“镜像”,映射了一段已经存在的字符列表。更明确地说,一个string_view仅仅包含一个指针和一个长度,用以定位一个字符数据区间。...string_view既不拥有这些数据,又不能修改这段存储。因此,复制string_view是浅拷贝,字符串内容不会被复制。...StrSplit()接受要分割的输入字符串、分割字符串的定界符(例如逗号,)和(可选)作为过滤器的谓词,以判断是否将分割元素包含在结果集中。...in $0 for user $1 ($2)", op, user, id); } absl::Substitute使用包含由美元符号 ($) 指示的位置标识符和单个数字位置 ID 的格式字符串来指示格式字符串中的该位置使用哪些替换参数

4K30

CMU 15445 2023fall #Project0 实现一个简单的k-v存储引擎

关于写时拷贝(Copy-On-Write,COW) 使用写时拷贝的情况下,当多个进程或线程共享同一份内存数据时,它们实际上共享同一个物理内存页。这意味着一开始,这些进程或线程都指向相同的内存页。...写时复制trie中,操作不直接修改原始trie的节点。而是为修改后的数据创建新的节点,并为新修改的trie返回新的根。root中插入 ("ad", 2) 。...遍历key的字符,如果当前字符cur的子节点map中,则让cur等于当前字符cur的子节点中的映射节点继续遍历;否则不存在该key,直接返回nullptr即可。 最后把找到的value指针返回。...nullptr : tnwv->value_.get(); } // 检查根节点是否为空,则返回当前的 Trie if (this->root_ == nullptr) { return...获取递归的结果,如果为false,则说明没有删除任何节点,直接返回false,否则判断当前节点是否可删除(是否为value节点 or 是否有子节点),如果可删除则删除当前节点并返回true。

56510

C++17,标准库有哪些新变化?

(strView变量), 而第16行代码中创建的 std::string_view(strView2变量) 引用的则是字符数组.第9行代码中,我们通过组合使用 remove_prefix 和 find_first_not_of...方法移除了 strView 的所有前导空格符,同样第21行代码中, 借助 remove_suffix 方法, strView2 的所有尾随"\0"符号也被移除了....p.path() << std::endl; } fs::remove_all("sandbox"); return 0; } 第9行代码中的 fs::current_path() 方法可以返回当前工作目录....type().name(): " << anyVec[1].type().name() << std::endl; // i return 0; } 示例代码的输出已经注释中写明了...可以存储任意类型(译注:这里的任意类型指可复制的类型)的数据,而 std::optional 则支持存储数据或者不存储数据. std::optional std::optional 这里就不做介绍了,之前我写的

1.2K10

c++17好用的新特性总结

c++14中,auto关键字的能力进一步提升,能够通过return语句推导出函数的返回类型。 使用auto关键字能够提高编码效率,同时能够简化重构流程。...处理子串时,std::string::substr也需要进行拷贝和分配内存,而std::string_view::substr则不需要,处理大文件解析时,性能优势非常明显。...void*时,T的类型信息就已经丢失了,转换回具体类型时程序无法判断当前的void*的类型是否真的是T,容易带来安全隐患。...常用于可能失败的函数的返回值中,比如工厂函数。C++17之前,往往使用T*作为返回值,如果为nullptr则代表函数失败,否则T*指向了真正的返回值。...通过使用std::variant,用户可以实现类似Rust的std::result,即在函数执行成功时返回结果,失败时返回错误信息,上文的例子则可以改成。

3.1K10

Opentelemetry-cpp的Logs模块标准更新

命名变更 首先,规范定义了一个 LogRecord 类型,并且要求API组件中实现的导出接口全部以这个 LogRecord 为基准,LogRecord 要求实现所有字段的 setter 接口。...,并且继承关系中,仅需要实现 Logger::EmitLogRecord(nostd::unique_ptr) 。...非常古老的版本中,Logs的协议里有 name 字段,所以 Logger::Log(...) 接口里也有个 name 参数。...但是实际上很早期的一次协议更新就已经移除这个字段了(从v1.4.0版本开始),我们接口层保留了相当长的时间,并且设置为了 deprecated 就是为了给用户一段时间去迁移。...首先由于传入的参数 ArgumentType 是个通用引用,它既能匹配左值引用,又能匹配右值,还能匹配是否带 const 和 violate ,所以第一层模板类型提取我们可以用 std::decay<ArgumentType

48620
领券