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
ます。実際に私はそれが「OK」ことになる要素の内部に持っている場合を考えることができない[first, last)
ようにしますvalue
。
説明のために、参照としてar[0]
宣言x
した場合と同じ間違った出力が得られると考えてください。
int& x=ar[0];
ar.erase(remove(ar.begin(),ar.end(),x),ar.end());
ここx
はconst
参照として渡されますが、アルゴリズムはを変更しar[0]
ます。