The Ranges Library (2) --- C++20

The Ranges Library (2) — C++20

比较stdstd::ranges算法

比较一下std::sortstd::ranges::sort

  • std::sort
template< class RandomIt >
constexpr void sort( RandomIt first, RandomIt last );template< class ExecutionPolicy, class RandomIt >
void sort( ExecutionPolicy&& policy,RandomIt first, RandomIt last );template< class RandomIt, class Compare >
constexpr void sort( RandomIt first, RandomIt last, Compare comp );template< class ExecutionPolicy, class RandomIt, class Compare >
void sort( ExecutionPolicy&& policy,RandomIt first, RandomIt last, Compare comp );
  • std::ranges::sort
template <std::random_access_iterator I, std::sentinel_for<I> S,class Comp = ranges::less, class Proj = std::identity>
requires std::sortable<I, Comp, Proj>
constexpr I sort(I first, S last, Comp comp = {}, Proj proj = {});template <ranges::random_access_range R, class Comp = ranges::less, class Proj = std::identity>
requires std::sortable<ranges::iterator_t<R>, Comp, Proj>
constexpr ranges::borrowed_iterator_t<R> sort(R&& r, Comp comp = {}, Proj proj = {});

你观察一下第二个重载,你会发现, 他需一个支持ranges::random_access_range的容器

std::forward_liststd::liststd::dequestd::arraystd::vector
std::ranges::random_access_range

一个谓词 Comp(返回bool的可调用对象),一个std::identity,Comp默认是less,Prog是std::identity :就是参数本身,本质是使用完美转发, 按照Prog将一个集合映射到子集

#include <iostream>
#include <ranges>
#include <vector>
#include <algorithm>using namespace std;struct PhoneBookEntry
{std::string name;int number;
};void printPhoneBook(const std::vector<PhoneBookEntry>& phoneBook)
{for (const auto& entry : phoneBook) std::cout << "(" << entry.name << ", " << entry.number << ")";std::cout << "\n\n";
}int main()
{std::cout << '\n';std::vector<PhoneBookEntry> phoneBook{{"Brown", 111}, {"Smith", 444},{"Grimm", 666}, {"Butcher", 222},{"Taylor", 555}, {"Wilson", 333}};std::ranges::sort(phoneBook, {}, &PhoneBookEntry::name); // 按姓名升序printPhoneBook(phoneBook);std::ranges::sort(phoneBook, std::ranges::greater(),&PhoneBookEntry::name); //按姓名降序printPhoneBook(phoneBook);std::ranges::sort(phoneBook, {}, &PhoneBookEntry::number); // 按号码升序printPhoneBook(phoneBook);std::ranges::sort(phoneBook, std::ranges::greater(),&PhoneBookEntry::number); // 按号码降序printPhoneBook(phoneBook);
}

image-20220616153237923

如果你有更加复杂的要求,可以使用lambda函数这样的可调用对象

#include <iostream>
#include <ranges>
#include <vector>
#include <algorithm>
#include <string>
using namespace std;struct PhoneBookEntry
{std::string name;int number;
};void printPhoneBook(const std::vector<PhoneBookEntry>& phoneBook)
{for (const auto& entry : phoneBook) std::cout << "(" << entry.name << ", " << entry.number << ")";std::cout << "\n\n";
}int main()
{std::cout << '\n';std::vector<PhoneBookEntry> phoneBook{{"Brown", 111}, {"Smith", 444},{"Grimm", 666}, {"Butcher", 222},{"Taylor", 555}, {"Wilson", 333}};std::ranges::sort(phoneBook, {}, [](auto p) { return p.name; });printPhoneBook(phoneBook);std::ranges::sort(phoneBook, [](auto p, auto p2){return std::to_string(p.number) + p.name <std::to_string(p2.number) + p2.name;});printPhoneBook(phoneBook);
}

直接查看key和value

可以直接查看map中的 key 和 value

#include <iostream>
#include <ranges>
#include <vector>
#include <algorithm>
#include <string>
#include <unordered_map>using namespace std;int main()
{std::unordered_map<std::string, int> m{{"李宁", 12}, {"张三", 34}, {"张杰", 23}};auto names = std::views::keys(m);cout << "keys: ";for (auto name : names){cout << name << " ";}cout << endl;auto ages = std::views::values(m);cout << "values: ";for (auto age : ages){cout << age << " ";}cout << " ";
}

image-20220616162131843

但我们还有更加灵活的方式,使用lambda函数来完成一些更复杂的逻辑

Function Composition

上一篇文章中有提及, 但不是很复杂, 我们实现一些更复杂的逻辑

#include <iostream>
#include <ranges>
#include <vector>
#include <algorithm>
#include <string>
#include <unordered_map>using namespace std;int main()
{std::unordered_map<std::string, int> m{{"李宁", 12}, {"张三", 34}, {"张杰", 23}, {"西施", 18}, {"修勾", 4}};auto names = std::views::keys(m);cout << "keys: ";for (auto name : names){cout << name << " ";}cout << endl;auto ages = std::views::values(m);cout << "values: ";for (auto age : ages){cout << age << " ";}cout << " " << endl;std::cout << "张 开头的姓名: ";auto fistZ = [](const std::string& name) { return name.find("张", 0) == 0; };for (const auto& name : std::views::keys(m) | std::views::filter(fistZ)){cout << name << " ";}cout << endl;
}

image-20220616163534876

| 是一个语法糖, C(R)等价于 R | C

auto rev1 = std::views::reverse(std::views::keys(m));
auto rev2 = std::views::keys(m) | std::views::reverse;
auto rev3 = freqWord | std::views::keys | std::views::reverse;

Lazy Evaluation 惰性执行

上一篇文章已经介绍了

自定义View

#include <ranges>
#include <vector>
#include <iostream>template <class T, class A>
class VectorView : public std::ranges::view_interface<VectorView<T, A>>
{
public:VectorView() = default;VectorView(const std::vector<T, A>& vec) :m_begin(vec.cbegin()), m_end(vec.cend()){}auto begin() const { return m_begin; }auto end() const { return m_end; }
private:typename std::vector<T, A>::const_iterator m_begin{}, m_end{};
};int main()
{std::vector<int> v = {1, 4, 9, 16};VectorView view_over_v{v};// We can iterate with begin() and end().for (int n : view_over_v){std::cout << n << ' ';}std::cout << '\n';// We get operator[] for free when inheriting from view_interface// since we satisfy the random_access_range concept.for (std::ptrdiff_t i = 0; i < view_over_v.size(); i++){std::cout << "v[" << i << "] = " << view_over_v[i] << '\n';}
}

image-20220616173540337

perator[] for free when inheriting from view_interface
// since we satisfy the random_access_range concept.
for (std::ptrdiff_t i = 0; i < view_over_v.size(); i++)
{
std::cout << “v[” << i << "] = " << view_over_v[i] << ‘\n’;
}
}


[外链图片转存中...(img-wfU5FiLx-1655480994818)]

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/407981.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

WPF中的动画

WPF中的动画 周银辉动画无疑是WPF中最吸引人的特色之一&#xff0c;其可以像Flash一样平滑地播放并与程序逻辑进行很好的交互。这里我们讨论一下故事板。在WPF中我们采用Storyboard&#xf…

[访问系统] Api_Win32_Mac类工具包 (转载)

点击下载 Api_Win32_Mac.zip using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Runtime.InteropServices;namespace BaseFunction {class API{[DllImport("kernel32")]//内存public static extern void GlobalM…

constexpr 函数

constexpr 函数 — C 20 constexpr double pi 3.14;constexpr允许你在编译时使用典型的C函数语法进行编程,但这并不意味之constexpr只和编译期有关 constexpr函数可以在编译期运行,也可以在运行时运行 但在以下情况constexpr函数必须在编译期运行: constexpr函数在编译的上…

constexpr和consteval --- C++ 20

constexpr和consteval — C 20 标准库容器和算法库对constexpr 的应用 C20 中大量的算法和容器可以使用constexpr,这意味着你甚至可以再编译期vector<int>进行排序 Algorithms library - cppreference.com 如下: #include <iostream> #include <ranges>…

函数模板(参考《C++ Templates 英文版第二版》)

函数编程(参考《C Templates 英文版第二版》) Chapter 1 函数模板 1.1 一窥函数模板 template<class T> T max(T a, T b) {return b < a ? a : b; }#include "max1.hpp" #include <iostream> #include <string> #include <format>int…

Curiously Recurring Template Pattern奇怪的模板递归 --- C++20

Curiously Recurring Template Pattern 奇怪的模板递归 — C20 我们都知道C有静态多态和动态多态,动态多态通过虚函数表实现,他的缺点就是对效率产生一点点影响 可以用CRTP解决这个问题 我们先举一个动态多态的例子: #include <iostream> using namespace std;class …

PROJECT #0 - C++ PRIMER [CMU 15-445645]笔记

PROJECT #0 - C PRIMER [CMU 15-445/645]笔记 这是数据库领域的一门课程, 由卡内基梅隆大学副教授Andy Pavlo授课, 目前在网上有授课视频资料、实验以及配套的在线测评环境 (限时开放至2021年12月31日) 环境: wsl2 Clion Project #0 - C Primer 还是很简单的,主要目的是让…

简单JS实现对表的行的增删

这段代码非常的简单&#xff0c;仅仅作为自己的一个小小的记录&#xff01; ok&#xff0c;先上一个简单的图例&#xff0c;效果如下&#xff08;注意&#xff1a;这只是一个简单的例子&#xff0c;不过可以根据这个简单的例子&#xff0c;变化出更为复杂的效果&#xff09;&am…

Yii权限管理工具Srbac使用小结

一、关于Srbac Srbac是基于Yii 框架的 RBAC&#xff08;基于角色的访问控制&#xff09; 插件模块&#xff0c;用于帮助Yii开发人员更方便地进行权限控制&#xff0c;在实际应用过程中也比较方便。 二、安装配置Srbac 在Yii的官方网站的Extensions中已经收录了Srbac插件&#x…

概念concept和requires ---C++ 20

概念concept和requires —C 20 concept concept简化了模板编程的难度 我们可以使用**concept定义模板形参的约束条件T** 模板实力替换T后必须满足std::is_integral_v<C>;为true 例子: requires关键字可以直接约束模板形参T 如下: template <class C> concept …

向DataGridView中添加新的一行数据,可以添加到最后一行或作为第一行

我的开发环境&#xff1a;Microsoft Visual Studio .net 2005 这个程序是Windows Forms Application 新建一个Windows Forms Application项目&#xff0c;打开Form1&#xff0c;在窗体上放一个DataGridView控件和Button,在DataGridView的Columns中添加两列&#xff0c;Name分别…

DataGridView添加一行数据、全选、取消全选、清空数据、删除选中行

.net 2005下的Windows Form Application,一个DataGridView控件和4个Button&#xff0c;界面设置如下&#xff1a; 代码如下&#xff0c;有注解&#xff0c;相信大家都看得明白&#xff1a; using System;using System.Collections.Generic;using System.ComponentModel;using S…

类型萃取类型检查 Type-Traits LibraryType Checks --- C++20

类型萃取:类型检查 Type-Traits Library:Type Checks — C20 Type-Traits library 在C11的时候就已经发布,但依然随着C版本在不断更新 类型检查 Type Checks 每种类型就是十四种主要类型之一 主要类型 template <class T> struct is_void; template <class T>…