多态处理vector和hash_set的函数

时间:2011-09-07 18:42:01

标签: c++ stl vector polymorphism hashset

我在C ++中有一个函数,它接受一个向量并将一些项目推送到它上面。例如:

void MyFunction(vector<int>* output);

我想修改它,以便现在可以使用矢量一个hash_set。在Java中,这很容易,只需将函数更改为Collection(通用接口)。所有MyFunction都将元素放入给定的容器中,因此它不应该关心该容器是vector还是hash_set,只是有一些“插入”元素的概念。

感谢您的帮助!

4 个答案:

答案 0 :(得分:3)

他做一个直接模板的小问题。 Vector通常使用push_back,而hash_set将使用insert。

使用模板,但使用插入函数并插入.end()元素,以便向量保持快速操作 - 这是您最好的选择。如果它将插入位置作为一个位置提示(虽然它会起作用),你仍然会稍微减慢你的哈希集的速度。

使用insert(iter,val),通过在元素位于迭代器位置之前插入新元素来扩展contianer。这对于序列容器(向量)是正确的,而关联容器(hash_set)将仅使用该位置作为提示 - 但插入仍然可以正常工作。假设U与向量元素类型相同或可隐式转换为向量元素类型,下面的函数可用于将值U插入任何支持插入的容器中(所有STL都可以)。

template <typename T, typename U>
void InsertToContainer(T& container, U val)
{
    container.insert(container.end(), val);
}

答案 1 :(得分:1)

如果我理解正确,您可以使用 Boost::Variant

答案 2 :(得分:0)

功能模板可以让你更通用:

 template<typename T, typename Cont = std::vector<T> > void MyFunction(T t, Cont c);

此处默认容器为std::vector<T>,但如果您愿意,仍可以更改容器。

答案 3 :(得分:0)

如果需要使用两个容器之间不常见的方法,可以使用纯虚基类创建两个派生包装类,该基类为您希望用{{1}执行的操作定义一个公共接口和一个没有simliar方法名称的unordered_set,然后将指针或对基类的引用传递给函数。

例如,您的纯虚基类可以定义插入,查找,迭代等方法,并且可以掩盖方法名称的差异以及执行这些类型操作的这两个容器之间的方法使用。派生类型将是基类中纯虚方法的实际实现。您的函数将获取基类型的引用或指针,并且由于基类是多态的,您只需调用基类定义的接口方法,并同时使用vector和{{1}使用您的函数而不必担心线性容器和关联容器之间的实现差异和接口不匹配。