【问题标题】:Which order is used to stack or heap variable creation [duplicate]哪个顺序用于堆栈或堆变量创建[重复]
【发布时间】:2014-03-09 22:09:40
【问题描述】:

我有这个代码:

#include <algorithm>
#include <iostream>
#include <list>

using namespace std;

struct P
{
    bool operator()(const int &n) const
    {
        return n % 3 == 0;
    }
};

int main()
{
    std::list<int> l({ 5, 2, 6, 1, 13, 9, 19 });
    std::cout << l.size();
    std::remove_if(l.begin(), l.end(), P());
    std::cout << l.size() << std::endl;

    return 0;
}

打印出“77”。我预计它会打印出“75”,因为 P 结构的运算符 () 在其参数没有除以 3 的余数时返回 true。'6' 和 '9' 就是这种情况(两个元素七)。 我错过了什么吗?

谢谢。

【问题讨论】:

    标签: c++ stl-algorithm stdlist remove-if


    【解决方案1】:

    引用http://www.cplusplus.com/reference/algorithm/remove_if/

    该函数不能更改包含元素范围的对象的属性(即,它不能更改数组或容器的大小):删除是通过将 pred 返回 true 的元素替换为下一个元素来完成的它没有,并通过将迭代器返回到应该被视为其新的过去元素的元素来指示缩短范围的新大小。

    换句话说,它重新排列给定范围内的元素,以便所有未删除的元素都在开头,然后在未删除部分的末尾返回一个迭代器。但它不能删除任何元素,因为它对底层容器一无所知。

    【讨论】:

      【解决方案2】:

      是否有可能 std::remove_if 返回结果列表?

      【讨论】:

        【解决方案3】:

        remove/remove_if重新排序一个序列,它不会修改它。迭代器无法访问或了解它们来自的容器。您需要将结果传递给合适的erase 容器成员:

        l.erase(std::remove_if(l.begin(), l.end(), P()), l.end());
        

        不要忘记第二个l.end(),这样你就会得到erase 的双迭代器重载,它会擦除​​整个范围。如果你忘记了它,你最终会得到一个只删除一个元素的单迭代器重载。

        【讨论】:

          猜你喜欢
          • 2011-04-28
          • 2017-06-06
          • 2013-05-10
          • 2020-04-09
          • 2016-01-06
          • 2012-07-30
          • 2015-05-27
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多