函数,该函数以多态方式处理vector和hash_set
Function that polymorphically handles vector and hash_set
我在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_set
和vector
执行的操作,然后将指向基类的指针或引用传递给函数。
例如,纯虚拟基类可以定义用于插入、查找、迭代等的方法,并且可以掩盖执行这些类型操作的这两个容器之间方法名称和方法使用的差异。派生类型将是基类中纯虚拟方法的实际实现。您的函数将引用或指针指向基类型,由于基类是多态的,因此您只需调用基类定义的接口方法,并在函数中同时使用vector
和unordered_set
,就不用担心线性容器和关联容器之间的实现差异和接口不匹配。
- "error: no matching function for call to"构造函数错误
- 什么时候调用组成单元对象的析构函数
- 继承函数的重载解析
- 为什么随机数生成器不在void函数中随机化数字,而在main函数中随机化
- C++模板来检查友元函数的存在
- 递归函数计算序列中的平方和(并输出过程)
- 对RValue对象调用的LValue ref限定成员函数
- C++17复制构造函数,在std::unordereded_map上进行深度复制
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 在C++STL中是否有Polyval(Matlab函数)等价物?
- 为什么使用 "this" 指针调用派生成员函数?
- 将对象数组的引用传递给函数
- 函数调用中参数的顺序重要吗
- 函数向量_指针有不同的原型,我可以构建一个吗
- 使用不带参数的函数访问结构元素
- 为什么不区分大小写适用于 std::unordered_set的 std::hash 函数?
- 用于unordered_set<BSTR>的 Hash & EqualTo 函数
- c++11 std::hash函数对象类的线程安全性
- 为什么 std::hash<int> 似乎是恒等函数
- 没有匹配函数来调用类型 'hash<char">' 的对象(Stroustrup Book Drill)