C++编码规范——删除容器元素

删除容器特定元素惯用法

vector, string, deque, array, 使用erase-remove习惯的用法

    //删除值为2的元素
    std::string content("hello world");
    content.erase(std::remove(content.begin(), content.end(), ' '), content.end());

list, 使用list::remove

    //删除值为2的元素
    std::list<int> numbers = { 1,2,3,4 };
    numbers.remove(2);

标准的关联容器,使用erase成员函数

    //删除值为2的元素
    std::map<int, int> values = { {1,1},{2,2},{3,3} };
    values.erase(2);

删除容器满足特定条件元素的惯用法

vector, string, deque, array, 使用erase-remove习惯的用法

    //删除条件是:空格或Tab键的元素
    std::string content("hello world");
    content.erase(std::remove_if(content.begin(), content.end(), [](const char x)
       {return std::isspace(x) || x == '\t'; }),
        content.end());

list, 使用list::remove

    //删除条件是:值为2的元素
    std::list<int> numbers = { 1,2,3,4 };
    numbers.remove_if([](const int item) {return item == 2; });

标准的关联容器,使用remove_copy_if和swap,或者写一个循环来遍历容器中的所有元素,记住当把迭代器传给erase时,要对它进行后缀递增

//删除条件是:key为2的元素
    std::map<int, int> values = { {1,1},{2,2},{3,3} };
    std::map<int, int> valueTemps;
    remove_copy_if(values.begin(), values.end(), inserter(valueTemps, valueTemps.end()), 
        [](const std::pair<int, int>& item) {
            return item.first == 2;
        });
    swap(values, valueTemps);
    //删除条件是:key为2的元素
    std::map<int, int> values = { {1,1},{2,2},{3,3} };
    std::map<int, int> valueTemps;
    for (auto iter = values.begin(); iter != values.end();)
    {
        if (iter->first == 2)
        {
            values.erase(iter++);
        }
        else
        {
            ++iter;
        }
    }

注意:

采用erase-remove惯用法主要是基于性能考虑。因为对于顺序存储的容器如vector, string, deque, array来说,删除元素需要移动元素,代价很大。remove实现机制是统一先找出哪些元素需要被覆盖,等全部找到以后在进行一次性覆盖,而不是每找到一个需要覆盖的元素就将其进行覆盖。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容