4
#include <iostream>
#include <vector>
#include <set>
#include <algorithm>

using namespace std;

int main()
{
    vector<int> ar = {1, 2, 2, 2, 3, 4, 5, 5, 5, 6, 7};
    vector<int> sum;
    int n = ar.size();
    for (int i = 0; i < n; i++)
    {
        int x = ar[0];
        int frq = count(ar.begin(), ar.end(), x);
        int q = frq / 2;
        sum.push_back(q);

        ar.erase(remove(ar.begin(), ar.end(), x), ar.end()); // Doubt
    }
    int count = 0;
    int n1 = sum.size();
    for (int i = 0; i < n1; i++)
    {
        count = count + sum[i];
    }
    cout << count;
}

x如果不是直接传入函数ar[0],为什么会得到不同的结果?std::remove

xar[0]具有相同的价值。

4

1 回答 1

3

原因是std::remove通过引用获取最后一个参数。从cppreference

因为 std::remove 通过引用获取值,如果它是对范围 [first, last) 的元素的引用,它可能会出现意外行为。

这有点棘手,因为参数是作为const参考传递的:

template< class ForwardIt, class T >
ForwardIt remove( ForwardIt first, ForwardIt last, const T& value );

但是,仅仅因为ar[0]作为引用传递const并不意味着ar[0]不能通过其他方式进行修改。在这种情况下,它通过first/进行修改last。实际上,我想不出在内部有一个元素“可以”的[first, last)情况value

为了说明起见,假设您得到与ar[0]声明x为引用相同的错误输出:

int& x=ar[0];
ar.erase(remove(ar.begin(),ar.end(),x),ar.end());

这里x作为参考传递const,但算法确实修改了ar[0].

于 2020-08-19T13:09:20.323 回答