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
기능?
x
와 ar[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]
.