当前位置: 首页 > wzjs >正文

做网站的会计分录昆明seo技术培训

做网站的会计分录,昆明seo技术培训,信誉好的镇江网站建设,英文网站建设390文章目录 引言C20 Ranges库回顾什么是Rangesstd::views的作用 views::as_rvalue 概述基本概念原型定义工作原理 应用场景容器元素的移动与其他视图适配器结合使用 总结 引言 在C的发展历程中,每一个新版本都会带来一系列令人期待的新特性,这些特性不仅提…

文章目录

    • 引言
    • C++20 Ranges库回顾
      • 什么是Ranges
      • std::views的作用
    • views::as_rvalue 概述
      • 基本概念
      • 原型定义
      • 工作原理
    • 应用场景
      • 容器元素的移动
      • 与其他视图适配器结合使用
    • 总结

引言

在C++的发展历程中,每一个新版本都会带来一系列令人期待的新特性,这些特性不仅提升了语言的性能和表达能力,还为开发者提供了更加便捷和高效的编程方式。C++23作为C++标准的一个重要版本,也不例外。其中,views::as_rvalue(提案编号P2446R2)就是C++23引入的一个非常实用的特性,它与C++20引入的Ranges库紧密相关,为处理范围数据提供了新的视角和方法。

C++20 Ranges库回顾

在深入了解views::as_rvalue之前,我们有必要先回顾一下C++20引入的Ranges库。Ranges库是C++20的一个重要特性,它彻底改变了我们处理序列数据的方式,提供了更富有表现力、更易组合的抽象。

什么是Ranges

简单来说,Range就是一种可以遍历的序列,你可以把它想象成更智能、更灵活的数组或者容器。C++20引入了Ranges这个概念,让我们可以更方便地操作这些序列。例如,我们可以使用Ranges来过滤、转换、拼接序列等。

std::views的作用

std::views是C++20里提供的一系列工具函数,用来对序列进行各种变换。它可以帮助我们以一种非常直观的方式对序列进行操作,比如过滤、转换、切片等等。以下是一个简单的示例,展示了如何使用std::views来过滤出数组中的偶数,并将这些偶数加倍:

#include <iostream>
#include <vector>
#include <ranges>int main() {std::vector<int> numbers = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};auto result = numbers | std::views::filter([](int n) { return n % 2 == 0; })| std::views::transform([](int n) { return n * 2; });for (int n : result) {std::cout << n << ' ';}return 0;
}

在这个示例中,我们使用std::views::filterstd::views::transform对序列进行了处理,代码不仅简洁,而且非常直观。

views::as_rvalue 概述

基本概念

std::ranges::views::as_rvaluestd::ranges::as_rvalue_view是C++23引入的两个新特性,它们实际上是在Ranges中进行std::move的动作。views::as_rvalue是一个RangeAdaptorObject,它可以将输入范围的元素转换为右值引用,从而实现移动语义。

原型定义

以下是as_rvalue_view的原型定义:

template< ranges::view V >requires ranges::input_range<V>
class as_rvalue_view: public ranges::view_interface<as_rvalue_view<V>>

同时,还有一个模板定义:

template< class T >
inline constexpr bool enable_borrowed_range<std::ranges::as_rvalue_view<T>> =std::ranges::enable_borrowed_range<T>;

工作原理

views::as_rvalue会根据输入范围的元素类型来决定如何处理。如果输入范围的元素已经是右值,那么它会直接返回views::all(r);如果输入范围的元素是左值,那么它会返回as_rvalue_view{r}。这样可以避免对已经是右值的范围进行不必要的std::move操作,从而提高性能。例如:

import std ;
int main ( ) {std::string str = "move, all_move, as_rvalue" ; // 入力文字列を', 'で分割して、それに何かを付け加えて、stringのvectorに诘める auto strvec = str | std::views::split(std::string_view { ", " } ) | std::views::transform([](auto substr) -> std::string { return "views::" + std::string(std::from_range, substr); } ) | std::views::as_rvalue // 何もしない | std::ranges::to<std::vector> ; // 2行目のtransformによってstd::stringのprvalueの范囲となっており // as_rvalueは何もせず、最后のranges::toによるvectorへの挿入ギリギリまでprvalueは実体化しない for (auto & str : strvec) {std::println("{:s}", str); }
}

在这个示例中,由于transform操作已经将元素转换为std::string的prvalue范围,所以as_rvalue不会进行任何操作,避免了不必要的开销。

应用场景

容器元素的移动

views::as_rvalue在处理容器元素的移动时非常有用。例如,当我们需要将一个容器中的元素移动到另一个容器中时,可以使用views::as_rvalue来避免不必要的复制操作。以下是一个示例:

#include <iostream>
#include <vector>
#include <list>
#include <ranges>
#include <memory>int main() {std::vector<std::unique_ptr<int>> upvec;upvec.emplace_back(std::make_unique<int>(10));upvec.emplace_back(std::make_unique<int>(100));upvec.emplace_back(std::make_unique<int>(17)); // 使用views::as_rvalue将元素移动到list中auto up_list = upvec | std::views::as_rvalue | std::ranges::to<std::list>; for (const auto& ptr : up_list) {std::cout << *ptr << ' ';}std::cout << std::endl;return 0;
}

在这个示例中,我们使用views::as_rvalueupvec中的元素移动到up_list中,避免了复制操作,提高了性能。

与其他视图适配器结合使用

views::as_rvalue还可以与其他视图适配器结合使用,实现更复杂的操作。例如,我们可以先使用views::filter过滤出满足条件的元素,再使用views::as_rvalue将这些元素转换为右值引用,最后将它们移动到另一个容器中。以下是一个示例:

#include <iostream>
#include <vector>
#include <list>
#include <ranges>
#include <memory>int main() {std::vector<std::unique_ptr<int>> upvec;upvec.emplace_back(std::make_unique<int>(10));upvec.emplace_back(std::make_unique<int>(100));upvec.emplace_back(std::make_unique<int>(17)); // 过滤出大于50的元素,并将它们移动到list中auto up_list = upvec | std::views::filter([](const auto& ptr) { return *ptr > 50; })| std::views::as_rvalue | std::ranges::to<std::list>; for (const auto& ptr : up_list) {std::cout << *ptr << ' ';}std::cout << std::endl;return 0;
}

在这个示例中,我们先使用views::filter过滤出大于50的元素,再使用views::as_rvalue将这些元素转换为右值引用,最后将它们移动到up_list中。

总结

views::as_rvalue是C++23引入的一个非常实用的特性,它与Ranges库紧密结合,为处理范围数据提供了新的视角和方法。通过将输入范围的元素转换为右值引用,views::as_rvalue可以实现移动语义,避免不必要的复制操作,从而提高性能。同时,它还可以与其他视图适配器结合使用,实现更复杂的操作。在实际开发中,合理使用views::as_rvalue可以让我们的代码更加高效和简洁。

http://www.dtcms.com/wzjs/413145.html

相关文章:

  • 国外室内设计案例网站微信客户管理
  • 企业网站seo优石家庄全网seo
  • 端掉一个wordpress网站搜索优化整站优化
  • 消防有哪些网站合适做东莞seo代理
  • 我的深圳app官网下载青岛seo搜索优化
  • wordpress网站模板下载头条今日头条
  • 培训前端网站开发惠州seo代理商
  • 做网站互联网公司网络优化app
  • 郑州有没有做妓男平台以及网站新闻稿范文
  • 做内贸现在一般都通过哪些网站域名免费查询
  • 二手交易网站开发方式论坛推广的特点
  • 国外的包装设计网站网站运营推广选择乐云seo
  • 有个专门做3d同人网站电话营销系统
  • 那些网站可以做海报老师直播课
  • 防城港北京网站建设福州百度首页优化
  • 高端网站设计简介百度推广如何计费
  • 重庆网站建设设计百度排名优化
  • 网页制作与网站建设宝典 pdf好搜seo软件
  • 网站建设需要学代码吗关联词有哪些三年级
  • 万网的怎么做网站地图什么是信息流广告
  • 网站显示目录科学新概念seo外链
  • 做建材的网站好名字销售课程视频免费
  • iis添加网站后怎么打开软文营销
  • 旅游营销型网站建设快手刷粉网站推广
  • mvc5 web网站开发实战模板下载网站
  • html5网站布局教程中国站长素材网
  • 温州合作网站重大新闻事件
  • 自助建站软件下载软文网站平台
  • 上海集团网站建设公司好三只松鼠营销策划书
  • wap网站预览快速建站工具