8

超クールなラムダ関数で記述されたvector/list/...関数のすべてのポインターを単純に削除しようとしています。

template <typename T>
void delete_clear(T const& cont)
{
    for_each(T.begin(), T.end(), [](???){ ???->delete() } );
}

???に何を記入すればいいのかわかりません。どんな助けでも大歓迎です!

更新:これはどのように見えるべきかです:

template <typename Container>
void delete_clear(Container &c)
{
    for_each(c.begin(), c.end(), [](typename Container::value_type x){ delete x; } );
    c.clear();
}
4

3 に答える 3

9

ここでの2つの問題:ラムダ構文自体と、コンテナーの値型を取得する方法:

mydelete()各ポインターで関数を呼び出すには(mydelete()メンバー関数を定義していると仮定):

for_each(c.begin(), c.end(), [](typename T::value_type x){ x->mydelete(); } );

削除演算子を使用してそれらを削除するには:

for_each(c.begin(), c.end(), [](typename T::value_type x){ delete x; } );

また、ラムダは、特定の問題に対するC++11の最もクールな新機能であるとは限りません。

for(auto x : c) { delete x; }

コンテナへのconst参照を取得し、その中のすべてを削除するのは少し危険ですが、ポインタが何であるかによって言語が停止することはありません。ただし、コンテナの意味と使用法の範囲内で、これは「一定の」操作であると確信していますか?

このコードを作成している場合は、 Boostポインターコンテナーまたはのコンテナーの恩恵を受ける可能性がありshared_ptrます。

于 2010-05-19T20:07:16.930 に答える
5

次のようなものはどうですか?

template <typename Container>
void delete_all(const Container& c)
{
    typedef typename Container::value_type Value;
    std::for_each(c.begin(), c.end(), [](const Value& v){ delete v; });
}

これはコンテナからポインタを削除しないことに注意してください。したがって、これを呼び出した後は、コンテナとそれに含まれるポインタをどうするかについて非常に注意する必要があります。

于 2010-05-19T20:06:30.613 に答える
1

特にラムダに興味がありますか?

Boostを使用している場合は、次のように書くことができます。

for_each(c.begin(), c.end(), boost::checked_delete<Container::value_type>);
于 2010-05-21T10:09:43.300 に答える