方法插入到任何stl集合中

method inserting into any stl collection

本文关键字:集合 stl 任何 插入 方法      更新时间:2023-10-16

我想写一个方法,它可以接受一个集合或列表,并在其中插入一个项目。

所以我有

bool getValues(const std::string& query, std::vector<T> *pVals) const {
}

但是我想要的不是std::vector,而是更通用的东西,这样我就可以传递一个向量或集合。某种迭代器?

STL的工作方式是为要处理的范围的开始和结束接受模板化的迭代器。当需要一般插入元素时,可以使用特殊的插入迭代器

// accept inserters instead of a container and use a template
// to make it generic (different inserter types)
template<typename InsertIter>
bool getValues(const std::string& query, InsertIter inserter) {
// make sure what you do here works for both vectors and sets
for(int i = 0; i < 6; ++i)
inserter = i; // generic insertion
// ... etc
}

像这样使用

std::vector<int> v;
// vectors use a std::back_inserter (calls push_back())
getValues("", std::back_inserter(v));
std::set<int> s;
// sets use an std::inserter (calls insert())
getValues("", std::inserter(s, s.end()));

如果您想要支持集合,那么迭代器可能是不够的。http://en.cppreference.com/w/cpp/container/set将set的迭代器类型指定为"Constant Bidirectional iterator",这意味着你将无法分配给它。另一个内置类型的候选者是Container,但我找不到任何一种支持插入的Container,它既适用于vector也适用于set。

其基本原因是向量和集合的行为不同。矢量在其元素上定义一个顺序,并支持重复。布景也不行。

如果你愿意忽略这种行为,你可以创建自己的类来实现你想要的。例如,用纯虚拟函数insert(T&item)声明一个类Insertable,然后为要使用的每种容器创建一个从Insertable派生的类。在类的构造函数中获取一个指向这种容器的指针,将其存储为类成员,并重写insert()来定义所需的行为。然后将函数定义为采用Insertable参数,您应该能够将指针传递给任何容器——编译器将为您调用构造函数。