接受std::vector作为参数的c++模板函数

C++ template function that receives std::vector as argument

本文关键字:c++ 函数 std vector 接受 参数      更新时间:2023-10-16

我需要创建一个模板函数,它接收某种类型的std::容器作为参数——比如std::vector,并从该容器中删除所有元素。我需要一个等价的函数:

for_each(some_vector.begin(), some_vector.end(), [](some_vector_type* element){delete element;}); 

调用应该像这样:

delete_all_elements(some_vector);

这可能吗?

编辑:我想在delete_all_elements
中使用第一个代码

为什么不呢?

template <typename C>
void delete_all_elements(C& container) {
    std::for_each(
        container.begin(), container.end(),
        [](typename C::value_type ptr) { delete ptr; }
    );
    container.clear();
}

您可以在开头添加例如static_assert(std::is_pointer<typename C::value_type>::value, "Elements must be pointers");,以确保您不会试图删除非指针。

为什么不像几乎所有STL算法那样做呢?

template<typename Iterator>
void delete_all_elements(Iterator begin, Iterator end) {
    while (begin != end) {
        delete *begin;
        ++begin;
    }
}

规范的方式是:

template <typename I>
void delete_all_elements(I begin, I end)
{
    for (; begin != end; ++begin) delete *begin;
}

您正在寻找这个(c++ 03解决方案):

template<typename Container>
void delete_all(const Container & c)
{
   typename Container::const_iterator begin = c.begin(), end = c.end();
   while ( begin != end ) { delete *begin; ++begin; }
}