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 numbers = { 1,2,3,4 };
    numbers.remove(2);

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

    //删除值为2的元素
    std::map 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 numbers = { 1,2,3,4 };
    numbers.remove_if([](const int item) {return item == 2; });

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

//删除条件是:key为2的元素
    std::map values = { {1,1},{2,2},{3,3} };
    std::map valueTemps;
    remove_copy_if(values.begin(), values.end(), inserter(valueTemps, valueTemps.end()), 
        [](const std::pair& item) {
            return item.first == 2;
        });
    swap(values, valueTemps);
    //删除条件是:key为2的元素
    std::map values = { {1,1},{2,2},{3,3} };
    std::map 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实现机制是统一先找出哪些元素需要被覆盖,等全部找到以后在进行一次性覆盖,而不是每找到一个需要覆盖的元素就将其进行覆盖。

你可能感兴趣的:(C++编码规范——删除容器元素)