x 대신 std :: remove 함수에서 배열 요소 ar [0]을 직접 전달하면 다른 결과가 나타나는 이유는 무엇입니까? [복제]

Aug 19 2020
#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]같은 값을 가지고있다.

답변

3 largest_prime_is_463035818 Aug 19 2020 at 13:09

그 이유는 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].