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

有没有做那个的视频网站北京金融网站建设

有没有做那个的视频网站,北京金融网站建设,邢台网站建设免费做网站排名,wordpress酒店文章目录 引言C20范围库回顾C23之前常量迭代器的问题视图可能不传播const代理对象的复杂性泛型代码中的一致性 P2278R4提案及C23的改进std::views::as_const的工作原理代码示例 浅const视图(如std::span)的改进总结 引言 在C的发展历程中,每…

文章目录

    • 引言
    • C++20范围库回顾
    • C++23之前常量迭代器的问题
      • 视图可能不传播`const`
      • 代理对象的复杂性
      • 泛型代码中的一致性
    • P2278R4提案及C++23的改进
      • `std::views::as_const`的工作原理
      • 代码示例
    • 浅const视图(如`std::span`)的改进
    • 总结

引言

在C++的发展历程中,每一个新版本都带来了一系列令人期待的新特性,这些特性不仅提升了语言的性能和表达能力,还为开发者提供了更加便捷和高效的编程方式。C++23作为C++标准的一个重要版本,在很多方面进行了完善和优化。其中,对常量迭代器、哨兵和范围的修正,特别是ranges::cbegin和其他类似实用程序的改进,是值得关注的一个点。本文将深入探讨C++23在这方面的改进,以及提案P2278R4所带来的变化。

C++20范围库回顾

在了解C++23的改进之前,我们先来回顾一下C++20引入的范围库(Ranges)。范围库是C++20的一个重要特性,它彻底改变了我们处理序列数据的方式,提供了更富有表现力、更易组合的抽象。简单来说,Range就是一种可以遍历的序列,你可以把它想象成更智能、更灵活的数组或者容器。C++20引入了Ranges这个概念,让我们可以更方便地操作这些序列,例如,可以使用Ranges来过滤、转换、拼接序列等。

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对序列进行了处理,代码不仅简洁,而且非常直观。

C++23之前常量迭代器的问题

在C++中,常量正确性是编写安全、可维护代码的基石。当我们传递一个对象给一个函数并期望它不被修改时,我们通常会使用const限定符。对于范围而言,我们期望std::ranges::cbeginstd::ranges::cend提供常量迭代器,从而允许只读访问。然而,在某些情况下,事情并不那么简单。

视图可能不传播const

某些视图可能被设计为即使在const合格的范围上操作,其迭代器解引用也可能返回可修改的引用或代理。这就导致了即使我们使用了cbegincend,仍然有可能意外地修改底层数据。

代理对象的复杂性

std::vector<bool>这样的特化容器,或者某些自定义视图,其operator*返回的是代理对象而不是直接引用。这些代理对象的常量行为可能与预期不符。如果代理对象没有正确处理常量性,即使原始范围是const的,或者我们通过cbegin()获取了迭代器,仍有可能意外地修改底层数据(或者更常见的是,代理对象本身提供了修改操作,而我们希望禁止它)。

泛型代码中的一致性

当编写接受各种范围的泛型代码时,确保统一的只读访问可能很棘手。我们希望有一种方法强制任何传入的范围都表现为常量序列。

P2278R4提案及C++23的改进

为了解决这些问题并进一步增强范围库的健壮性,C++23带来了std::views::as_const(提案P2278R4)。这个小巧但功能强大的视图适配器(view adaptor)为我们提供了一种明确的方式来获取一个范围的常量视图,确保通过该视图访问的元素都是常量。

std::views::as_const的工作原理

std::views::as_const是一个范围适配器对象。当你将一个范围r通过管道传递给views::as_const(即r | std::views::as_const)时,它会返回一个新的视图。这个新视图具有以下关键特性:

  • 常量元素访问:对其迭代器解引用(*it)将产生一个常量左值引用(const T&),或者一个其行为类似于常量引用的代理对象。这意味着你不能通过这个视图修改元素。
  • 基于std::as_const:它的行为类似于对范围中的每个元素应用std::as_const。回想一下,std::as_const(x)会返回x的一个常量左值引用。views::as_const将这个概念扩展到了整个范围。
  • 保留底层范围的类别:如果输入范围是一个common_rangesized_range等,views::as_const生成的视图通常也会是相应类别的范围(如果适用)。

代码示例

让我们通过一些例子来看看views::as_const的实际应用:

#include <iostream>
#include <vector>
#include <ranges> // 需要 C++20/23 范围支持
#include <string>void print_elements_const(std::ranges::range auto const& r) {for (const auto& elem : r) {// elem 在这里是 const// elem = "new value"; // 编译错误std::cout << elem << " ";}std::cout << std::endl;
}int main() {std::vector<std::string> data = {"hello", "world", "c++23"};std::cout << "Original data: ";for (const auto& s : data) {std::cout << s << " ";}std::cout << std::endl;// 创建一个 data 的常量视图auto const_view = data | std::views::as_const;std::cout << "Through views::as_const: ";for (const auto& elem : const_view) { // elem 也是 const std::string&std::cout << elem << " ";// elem = "test"; // 编译错误!无法通过 const_view 修改}std::cout << std::endl;// 尝试修改 const_view 中的元素 (将导致编译错误)// if (!const_view.empty()) {//     const_view.front() = "modified"; // 编译错误// }// 即使原始数据不是 const,也可以传递 const_view 给期望 const 范围的函数print_elements_const(const_view);// 原始数据仍然可以被修改 (如果它不是 const)data[0] = "Greetings";return 0;
}

在这个示例中,我们创建了一个std::vector<std::string>类型的data,然后通过std::views::as_const创建了它的常量视图const_view。我们可以看到,通过const_view访问元素时,无法对元素进行修改,而原始数据data仍然可以被修改。

浅const视图(如std::span)的改进

C++23中,对于浅const视图,例如std::spanranges::cbegin和其他类似的实用程序返回的常量迭代器得到了完全保证。std::span是C++20引入的一种语法糖,用于表示连续内存范围。它提供了一种轻量级的、非拥有式的、零开销的方式来引用数组或其他连续内存块。

在C++23之前,std::ranges::cbegin返回的是指向const限定参数的第一个元素的迭代器。而从C++23开始,它返回的是参数的第一个元素的常量迭代器。对于std::span,在C++23中也新增了cbegin()cend()成员函数,返回常量迭代器,确保了即使对于浅const视图,也能提供可靠的只读访问。

以下是一个关于std::span使用常量迭代器的示例:

#include <iostream>
#include <span>void print(std::span<const int> array) {std::cout << "array = ";for (auto it = array.cbegin(); it != array.cend(); ++it) {std::cout << *it << ' ';}std::cout << '\n';
}int main() {int array[]{1, 3, 4, 5};print(array);return 0;
}

在这个示例中,我们定义了一个print函数,接受一个std::span<const int>类型的参数。在函数内部,我们使用cbegin()cend()来遍历span,确保不会修改其内容。

总结

C++23对常量迭代器、哨兵和范围的修正,特别是ranges::cbegin和其他类似实用程序的改进,以及std::views::as_const视图适配器的引入,解决了C++20范围库在常量正确性方面存在的一些问题。这些改进使得开发者在编写代码时能够更加方便地处理常量范围,确保数据的只读访问,提高了代码的安全性和可维护性。同时,对于浅const视图(如std::span),常量迭代器的保证也让我们在使用这些视图时更加放心。随着编译器对C++23标准的逐步支持,这些新特性将为C++程序员提供更多的便利和灵活性。


文章转载自:

http://2xwraqwc.xmrmk.cn
http://mlREeqg9.xmrmk.cn
http://kWvEbhnN.xmrmk.cn
http://J2JsJpXM.xmrmk.cn
http://bx1BZWmF.xmrmk.cn
http://DJx2OST5.xmrmk.cn
http://ubgTYnix.xmrmk.cn
http://4MpZCytJ.xmrmk.cn
http://ZcR0BjsZ.xmrmk.cn
http://mEtBPOW6.xmrmk.cn
http://MrqWDErU.xmrmk.cn
http://zZOfOzxL.xmrmk.cn
http://vV60htjh.xmrmk.cn
http://wknKctCX.xmrmk.cn
http://a6Q0murF.xmrmk.cn
http://kA1JmoaC.xmrmk.cn
http://xUibD3fB.xmrmk.cn
http://seH5Lakw.xmrmk.cn
http://EzC6QUtq.xmrmk.cn
http://d0U8tqHX.xmrmk.cn
http://4VrvKKzX.xmrmk.cn
http://wbj7TnPY.xmrmk.cn
http://nDK87q6T.xmrmk.cn
http://TDB42P3Q.xmrmk.cn
http://FWrFVe4G.xmrmk.cn
http://b8LV2aKY.xmrmk.cn
http://8WN5EI2y.xmrmk.cn
http://MHE9Jn8p.xmrmk.cn
http://5PXDsL0S.xmrmk.cn
http://CqcgWWgV.xmrmk.cn
http://www.dtcms.com/wzjs/740416.html

相关文章:

  • 科技网站导航哪里有免费的seo视频
  • 长沙小学网站建设网站建设需要多少
  • 郑州做网站好的公司上市的网站设计公司
  • 专业做网站推广的公司如何设计网页页面
  • h5网站建设 北京建设一个网站平台的费用吗
  • 优质的网站山东省住房与城乡建设网站
  • 唐山网站建设培训旅游网站如何建设
  • 淘宝客是以下哪个网站的会员简称无锡专业网站制作的公司
  • 做ui的图从哪个网站找赣州抖家网络科技有限公司
  • 最讨厌网站深圳外贸网页设计
  • 广州商城型网站建设长沙做网站要多少钱
  • 网站超链接怎么做 word文档海口制作网站企业
  • 网站建设设计团队自媒体平台前十名
  • 丹东做网站公司起点签约的书网站给做封面吗
  • 建设咖啡厅网站的意义建设厅官方网站职称
  • 注册域名去哪个网站好怎么做微信里的网页网站链接
  • 基于jsp的电子商务网站开发dw用层还是表格做网站快
  • 众筹网站开发需求类型: 营销型网站建设
  • 网站建设要求 优帮云用vs做网站原型
  • 专业网站建站h5自适应网站源码
  • server 2008 网站部署的wordpress博客模板
  • 域名备案掉了网站还可以用wordpress怎么套模板
  • 浙江省工程建设信息官方网站asp.net 网站开发项目化教程
  • 视频剪辑自学网站wordpress digg
  • 三亚做网站济南营销型网站建设贵吗
  • 建企业门户网站广州科 外贸网站建设
  • 做的最好的网站公司做外贸在哪个网站
  • 百度云服务器做asp网站杭州seo教程
  • 网站设计编程有哪些同声传译公司网站建设
  • 专业电商网站济宁网站开发平台