他のトピックでは、この問題を解決しようとしていました。問題は、から重複する文字を削除することでしたstd::string
。
std::string s= "saaangeetha";
順序は重要ではないため、s
最初に並べ替えてから使用std::unique
し、最終的にサイズを変更して目的の結果を取得しました。
aeghnst
それは正しいです!
今、私は同じことをしたいのですが、同時に文字の順序をそのままにしたいのです。つまり、次の出力が必要です。
sangeth
だから私はこれを書いた:
template<typename T>
struct is_repeated
{
std::set<T> unique;
bool operator()(T c) { return !unique.insert(c).second; }
};
int main() {
std::string s= "saaangeetha";
s.erase(std::remove_if(s.begin(), s.end(), is_repeated<char>()), s.end());
std::cout << s ;
}
次の出力が得られます。
saangeth
つまり、a
繰り返されますが、他の繰り返しはなくなります。コードの何が問題になっていますか?
とにかく、コードを少し変更します:(コメントを参照)
template<typename T>
struct is_repeated
{
std::set<T> & unique; //made reference!
is_repeated(std::set<T> &s) : unique(s) {} //added line!
bool operator()(T c) { return !unique.insert(c).second; }
};
int main() {
std::string s= "saaangeetha";
std::set<char> set; //added line!
s.erase(std::remove_if(s.begin(),s.end(),is_repeated<char>(set)),s.end());
std::cout << s ;
}
出力:
sangeth
問題がなくなりました!
では、最初の解決策の何が問題なのですか?
また、メンバー変数をunique
参照型にしないと、問題は解決しません。
std::set
またはis_repeated
ファンクターの何が問題になっていますか? 問題はどこにありますか?
is_repeated
また、ファンクターがどこかにコピーされると、そのすべてのメンバーもコピーされることに注意してください。ここに問題はありません!