std :: unordered_set和std :: vector之间的多态性?

时间:2014-04-09 07:33:06

标签: c++ stl

我的代码中有一个函数,它接受一个C ++容器对象,并使用循环读取其中的每个元素。该函数看起来有点像这样:

void function(std::unordered_set<unsigned int> container)
{
    for(auto it = container.begin(); it != container.end(); it++)
    {
       /* Do something */
    }
}

但是,我希望这个函数也接受std :: vector类型的容器。从代码中可以看出,函数体不需要知道容器的类型(它只能使用*它访问每个元素)。如何在我的代码中没有冗余的情况下实现这一目标?

2 个答案:

答案 0 :(得分:3)

类似的东西:

template<typename ContainerType>
void function(ContainterType container)
{
  ... 
}

应该做你想做的事。

你需要一个模板,因为STL容器没有通用的基类,所以它们不能通过“这是基类,采取任何派生类型”。

假设你不想修改容器,我会选择:

template<typename ContainerType>
void function(const ContainterType& container)
{
   ...
}

避免复制。

答案 1 :(得分:2)

出于性能原因和更多“通用编程”(与OOP相对)的世界观或任何STL容器的设计并未考虑到多态性;相反,正如STL算法所做的那样,您需要公开一个基于迭代器的通用接口,并使用给您的任何迭代器类型。