首页 > 编程语言 >从 .NET 到 C++:集合处理的思考

从 .NET 到 C++:集合处理的思考

时间:2024-05-29 14:35:20浏览次数:14  
标签:std even int C++ vec 集合 NET include

1. IEnumerableList 的比较

在 .NET 中,IEnumerableList 是两种常用的集合类型,它们有各自的适用场景:

  • IEnumerable<T>
    • 优点:惰性求值,仅在迭代时计算,适用于大数据集或流式数据处理。
    • 缺点:不能进行索引访问,没有直接的添加或移除元素的方法。
  • List<T>
    • 优点:支持索引访问,具备丰富的修改集合的方法(如添加、移除元素)。
    • 缺点:非惰性求值,可能会占用更多内存。

在返回集合时,使用 IEnumerable<T> 可以提高灵活性和性能,特别是当集合操作需要惰性求值时。List<T> 则适合需要频繁增删元素或需要随机访问的场景。

2. IEnumerableIEnumerator 的区别

  • IEnumerable:表示一个可以被枚举的集合,提供一个 GetEnumerator 方法返回一个 IEnumerator
  • IEnumerator:表示一个枚举器,用于遍历集合中的元素,具有 MoveNextResetCurrent 属性。

3. C++ 中的集合处理

在 C++ 中,虽然没有直接对应 IEnumerable 的接口,但通过标准库的容器和迭代器,可以实现类似的功能。

标准库容器和迭代器

C++ 标准库提供了丰富的容器类型(如 std::vectorstd::liststd::set 等)和迭代器,这些容器和迭代器可以结合算法库来进行集合操作。

迭代器示例

#include <vector>
#include <iostream>

int main() {
    std::vector<int> vec = {1, 2, 3, 4, 5};
    for(auto it = vec.begin(); it != vec.end(); ++it) {
        std::cout << *it << std::endl;
    }
    return 0;
}
std::copy_ifstd::transform

C++98 引入了 std::copy_ifstd::transform,它们在 C++11 及之后版本中仍然可用,能够实现条件性复制和元素变换。

std::copy_if 示例

#include <vector>
#include <algorithm>
#include <iostream>

int main() {
    std::vector<int> vec = {1, 2, 3, 4, 5};
    std::vector<int> result;
    std::copy_if(vec.begin(), vec.end(), std::back_inserter(result), [](int n) { return n % 2 == 0; });

    for (int value : result) {
        std::cout << value << std::endl;
    }
    return 0;
}

std::transform 示例

#include <vector>
#include <algorithm>
#include <iostream>

int main() {
    std::vector<int> vec = {1, 2, 3, 4, 5};
    std::vector<int> result;
    std::transform(vec.begin(), vec.end(), std::back_inserter(result), [](int n) { return n * n; });

    for (int value : result) {
        std::cout << value << std::endl;
    }
    return 0;
}
综合示例:std::copy_ifstd::transform 结合
#include <vector>
#include <algorithm>
#include <iostream>

int main() {
    std::vector<int> vec = {1, 2, 3, 4, 5};
    std::vector<int> even_numbers;
    std::vector<int> even_squares;

    std::copy_if(vec.begin(), vec.end(), std::back_inserter(even_numbers), [](int n) { return n % 2 == 0; });
    std::transform(even_numbers.begin(), even_numbers.end(), std::back_inserter(even_squares), [](int n) { return n * n; });

    for (int value : even_squares) {
        std::cout << value << std::endl;
    }

    return 0;
}

4. 现代化的集合处理:C++20 的 std::ranges

C++20 引入了 std::ranges,为集合处理提供了类似于 LINQ 的功能。

示例代码

#include <vector>
#include <iostream>
#include <ranges>

int main() {
    std::vector<int> vec = {1, 2, 3, 4, 5};

    auto even_squares = vec 
                        | std::ranges::views::filter([](int n) { return n % 2 == 0; })
                        | std::ranges::views::transform([](int n) { return n * n; });

    for (int value : even_squares) {
        std::cout << value << std::endl;
    }

    return 0;
}

5. 第三方库:C++17 中的 Range-v3Boost.Range

Range-v3

Range-v3 是 C++20 std::ranges 的主要灵感来源,可以在 C++14 和 C++17 中使用。

安装

vcpkg install range-v3

示例代码

#include <range/v3/all.hpp>
#include <vector>
#include <iostream>

int main() {
    std::vector<int> vec = {1, 2, 3, 4, 5};

    auto even_squares = vec 
                        | ranges::views::filter([](int n) { return n % 2 == 0; })
                        | ranges::views::transform([](int n) { return n * n; });

    for (int value : even_squares) {
        std::cout << value << std::endl;
    }

    return 0;
}
Boost.Range

Boost.Range 提供了类似 Range-v3 的功能。

安装

vcpkg install boost-range

示例代码

#include <boost/range/adaptor/filtered.hpp>
#include <boost/range/adaptor/transformed.hpp>
#include <vector>
#include <iostream>

int main() {
    std::vector<int> vec = {1, 2, 3, 4, 5};

    auto even_squares = vec 
                        | boost::adaptors::filtered([](int n) { return n % 2 == 0; })
                        | boost::adaptors::transformed([](int n) { return n * n; });

    for (int value : even_squares) {
        std::cout << value << std::endl;
    }

    return 0;
}

无论是使用 C++20 的 std::ranges,还是在 C++17 及更早版本中通过 Range-v3Boost.Range,C++ 提供了强大的工具来进行现代化的集合处理。同时,通过 std::copy_ifstd::transform 等标准算法,C++11 及更早版本也可以实现高效的集合操作。了解并灵活应用这些工具,可以极大提高代码的可读性、简洁性和性能。

标签:std,even,int,C++,vec,集合,NET,include
From: https://www.cnblogs.com/linxmouse/p/18220207

相关文章

  • c++ 11 常用特性
     C++11常用特性总结 非原创,转载出处 http://www.cnblogs.com/feng-scC++11已经出来很久了,网上也早有很多优秀的C++11新特性的总结文章,在编写本博客之前,博主在工作和学习中学到的关于C++11方面的知识,也得益于很多其他网友的总结。本博客文章是在学习的基础上,加上博......
  • c++ 设计模板
     ========一、设计模式的分类总体来说设计模式分为三大类创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。行为型模式,共十一种:策略模式、模板......
  • c++ new delete
     =====================delete是我们c++中的关键字,我们都知道它和new是配套使用的,有new就有delete不然会存在内存泄漏的问题。但是我们使用过delete的同学可能会发现delete有两种形式,一种是delete[],那这两个有什么区别呢?1、delete释放new分配的单个对象指针指向的......
  • C++中的vector
    C++中的vector一丶vector的介绍和使用1.vector的简单介绍2.vector的使用I.构造函数II.相关的迭代器III.空间容量以及大小IV.vector的增删查改3.迭代器失效的问题二丶vector的深度剖析和模拟实现1.使用memcpy拷贝出现的问题2.vector的模拟实现一丶vector的介绍和......
  • Quasar (.NET3.5)通信建立,持续更新中
    Quasar(.NET3.5)通信建立quasar是一个知名的远控软件,这里解析它在.net3.5的版本。3.5可以解决windows的兼容性问题,即:经过一些方法编译为特定的计算机代码,可以在windows7-windows11的内存中加载执行Client端初始化函数Initialize()包含一些系统参数的获取,以及初始化客户......
  • net/http shutdown退出的原理
      使用nginxreload的时候,nginx会close掉listenfd,然后启动新的worker,老的worker继续工作直到当前的fd完全关闭后worker退出。目前使用gin框架的时候也需要频繁的在http:9000监听和htttps:9000之间切换。所以也涉及到上述逻辑看下gin框架中run启动listen的逻辑//Runat......
  • 大集合!!C语言指针知识要点大合集!!小白不要错过喔!!收藏这一篇就足够!!(1)
    指针!!是C语言最本质的特征,学好了指针才能算正式入门C语言喔!!如果你是C语言小白,看这篇文章就对啦!!✍什么是指针?在学习指针之前,我们要先了解内存。我们的代码在运行的时候,会把数据存放在哪里?放在内存里!内存地址内存就像是一栋大旅馆,这栋旅馆里有许多房间,每个房间有着不同的房......
  • asp.net mvc 多语言环境配置
    新建资源文件夹添加ASP.NET文件夹选择App_GlobalResources新建资源文件language.resxlanguage.en.resx创建了中文、英文两个语言的资源文件,中文是程序的默认语言。然后是language.en.resx,中间的“en”是英语的CultureName。如果你需要法语,那么你只需要再创建lang......
  • C++ - 结构体转cha*
    c语言结构体转cha*在C语言中,将结构体转换为char*通常意味着你想要获取结构体的内存表示,并将其视为字符数组。这种转换可以通过使用memcpy函数来实现。下面是一个简单的例子,展示了如何将结构体转换为char*: #include<stdio.h>#include<stdlib.h>#include<string.......
  • C++ - tcp网络传输如何发送结构体类型
    1、tcp网络传输如何发送结构体类型 在C++中,要通过TCP网络传输结构体类型,你需要将结构体序列化为字节流,然后在另一端反序列化。这里有一个简单的例子:#include<iostream>#include<cstring>#include<sys/socket.h>#include<netinet/in.h>#include<unistd.h>//假设......