私はどのソートされていない範囲のユニークな要素の数数えることができる機能unique_count
があるとします。私はしたくないので、私は新しいvector
を作成左辺値と右辺値の両方に割り当て参照
template<typename InputIt>
std::size_t unique_count(InputIt first, InputIt last)
{
using T = typename std::iterator_traits<InputIt>::value_type;
std::vector</* ??? */> v(first, last);
std::sort(v.begin(), v.end());
return std::distance(v.begin(),
std::unique(v.begin(), v.end()));
}
を元のコンテナを変更しますが、私は不要なコピーをしたくありません。最も簡単な解決策はポインタのベクトルを作ることですが、*first
はconst T&
(たとえば、vector
)またはT
(ストリームから)のいずれかを返すことがあります。
したがって、/* ??? */
の部分は、const T&
と概念的に同等である必要があります。 vector
は参照を保持することができないので、実際にはこれを行うことはできません。割り当てが解除されています。 reference_wrapper<const T>
のいずれも使用できません。なぜなら、一時的なものからは構成できないからです。
どのような代替手段がありますか?
は今、私はT 'と '間のベクトル値の種類を選択するために'のstd :: conditional'を使用しています'reference_wrapper' 'is_lvalue_reference :: value'に依存します。これは合理的なアプローチだと思いますか? –
@ZizhengTai私にはうってつけの音です。 – Brian