再帰テンプレートはまだ私にはかなり混乱しています。たとえば、再帰的なテンプレートを使用して、n次元ベクトルの重複メンバーをすべて削除する関数を作成しようとしましたが、動作するコードがいくつかあると思います。私はベースの静的変数として「見える」セット変数を宣言する方法http://coliru.stacked-crooked.com/a/6e11f9ababcdfa12N次元ベクトルの重複メンバーを削除
お知らせ:
template <typename T>
void remove_if_duplicate(std::vector<T>& vec, bool at_end)
{
static std::set<T> seen;
if(!at_end)
{
auto newEnd = std::remove_if(vec.begin(), vec.end(), [=](const T& value)
{
if(seen.find(value) != std::end(seen))
return true;
seen.insert(value);
return false;
});
vec.erase(newEnd, vec.end());
std::cout << "\n\nhere: " << at_end << "\n\n";
}
if(at_end) {seen.clear();}
}
template <typename T>
void remove_if_duplicate(std::vector<std::vector<T>>& v, bool at_end)
{
if(!at_end)
{
for(unsigned int i = 0; i < v.size(); i++)
{
remove_if_duplicate(v[i], at_end);
}
}
if(at_end) {remove_if_duplicate(v[0], at_end);}
}
template <typename T>
void remove_duplicates(std::vector<std::vector<T>>& v)
{
remove_if_duplicate(v, false);
remove_if_duplicate(v, true);
}
は、ここでは例を参照してください。しかし、私はこれを行うには良い方法があることをほとんど確信しています関数。私は多次元ベクトルを反復処理しても以前に見たことのある以前のアイテムにはまだアクセスできるようにこれを行いました。多次元ベクトルがテンプレート化されている基底型がその時点では不明である(そして、一次元ベクトルの場合もどちらもうまくいきません)ので、2番目の関数の中で "見た"変数を宣言することはできません。だから私は、これらの関数にブーリアンを渡して、実際に静的な変数をクリアするときを決めて、この関数を他のn次元のベクトルに使うことができるようにしなければなりません。
これまでのように動作しているように見えますが、私が望むふるまいを与えている間、実装が貧弱なために予期しないバグが表示されるかどうかはわかりません。私はこれをここでやったやり方は理想から遠いと思うし、より良い、より効率的な方法があると確信している。 どうやって違うのですか?