我的代码中有一个函数,它接受一个C ++容器对象,并使用循环读取其中的每个元素。该函数看起来有点像这样:
void function(std::unordered_set<unsigned int> container)
{
for(auto it = container.begin(); it != container.end(); it++)
{
/* Do something */
}
}
但是,我希望这个函数也接受std :: vector类型的容器。从代码中可以看出,函数体不需要知道容器的类型(它只能使用*它访问每个元素)。如何在我的代码中没有冗余的情况下实现这一目标?
答案 0 :(得分:3)
类似的东西:
template<typename ContainerType>
void function(ContainterType container)
{
...
}
应该做你想做的事。
你需要一个模板,因为STL容器没有通用的基类,所以它们不能通过“这是基类,采取任何派生类型”。
假设你不想修改容器,我会选择:
template<typename ContainerType>
void function(const ContainterType& container)
{
...
}
避免复制。
答案 1 :(得分:2)
出于性能原因和更多“通用编程”(与OOP相对)的世界观或任何STL容器的设计并未考虑到多态性;相反,正如STL算法所做的那样,您需要公开一个基于迭代器的通用接口,并使用给您的任何迭代器类型。