函数,该函数以多态方式处理vector和hash_set

Function that polymorphically handles vector and hash_set

本文关键字:函数 hash set vector 方式 多态 处理      更新时间:2023-10-16

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

void MyFunction(vector<int>* output);

我想对它进行修改,使其现在能够使用向量hash_set。在Java中,这很容易,只需将函数更改为Collection(公共接口(。MyFunction所做的只是将元素放入给定的容器中,因此它不必关心该容器是向量还是hash_set,只需要关心"插入"元素的概念。

谢谢你的帮助!

他在做一个直接的模板时会遇到一个小问题。Vector通常使用push_back,而hash_set则使用insert。

使用模板,但使用insert函数并在.end((元素处插入,这样向量就可以保持快速运算-这是你的最佳选择。不过,如果它将插入位置作为位置的提示,你仍然会稍微放慢哈希集的速度(不过它会起作用(。

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

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

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

函数模板可以让它更通用:

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

这里的默认容器是std::vector<T>,但如果您愿意,您仍然可以更改容器。

如果您需要使用两个容器之间不通用的方法,您可以创建两个派生包装器类,该类具有一个纯虚拟基类,该基类定义了一个通用接口,用于您希望使用没有类似方法名的unordered_setvector执行的操作,然后将指向基类的指针或引用传递给函数。

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