您的位置:

erasec++:一种高效的C++容器,提供值类型的移动语义

一、erase词根

erasec++这个名字,显然与C++中的std::erase函数有关。而这个函数就是按照给定的值或范围删除容器中的元素。

erasec++容器也是提供删除元素的功能,但是更加灵活,可以根据条件删除,也可以只删除部分元素,而不是全部。

二、erase擦除命令

erasec++容器的核心是一个命令式的API,这个API可以擦除容器中的元素,提供类似shell命令的思想,让API编写更加清晰易懂。

下面是一个简单的示例,我们定义了一个vector,其中存储着一些数字,然后我们想要删除其中小于10的元素,这样可以得到一个新的vector:

std::vector<int> v{1, 2, 10, 3, 4, 5, 6, 10, 7, 8, 9};

auto new_v = erase_if(v, [](int i) { return i < 10; });

上面的代码中,我们使用erase_if函数,其第一个参数表示被删除元素所在的容器,第二个参数表示一个判断函数,函数有一个参数,表示容器中的元素,如果函数返回true,表示需要删除此元素。函数执行完成后,new_v中只保留了大于等于10的元素。

三、erase词根词缀记忆法

为了让API更容易记忆,erasec++采用了词根词缀记忆法,每一个函数名都有erase词根的前缀,表示该函数与擦除有关,然后再加上对应的词缀表示具体所做的操作。

例如,如果要删除容器中某个范围内的元素,可以使用erase_range函数,如果需要按顺序删除容器中的元素,则可以使用erase_ordered函数。

四、代码示例

下面是完整的代码示例,展示了erasec++如何删除vector中的元素:

#include <iostream>
#include <vector>
#include <algorithm>
#include "erasec++.hpp" // 引入erasec++头文件

int main()
{
    std::vector<int> v{1, 2, 10, 3, 4, 5, 6, 10, 7, 8, 9};

    // 删除小于10的元素
    auto new_v = erase_if(v, [](int i) { return i < 10; });
    // 输出新的vector
    for (auto i : new_v)
    {
        std::cout << i << " ";
    }
    std::cout << std::endl;

    // 删除前三个元素
    erase_head(v, 3);
    // 输出新的vector
    for (auto i : v)
    {
        std::cout << i << " ";
    }
    std::cout << std::endl;

    // 删除后三个元素
    erase_tail(v, 3);
    // 输出新的vector
    for (auto i : v)
    {
        std::cout << i << " ";
    }
    std::cout << std::endl;

    // 删除指定范围内的元素
    erase_range(v, v.begin() + 2, v.begin() + 5);
    // 输出新的vector
    for (auto i : v)
    {
        std::cout << i << " ";
    }
    std::cout << std::endl;

    // 按顺序删除vector中的元素
    erase_ordered(v, {9, 4, 2});
    // 输出新的vector
    for (auto i : v)
    {
        std::cout << i << " ";
    }
    std::cout << std::endl;

    return 0;
}