插入任何stl集合的方法

时间:2017-01-21 04:51:05

标签: c++ stl

我想编写一个能够获取一个集合或一个列表并将一个项目插入其中的方法。

所以我有

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

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

2 个答案:

答案 0 :(得分:4)

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()));

答案 1 :(得分:0)

如果你想支持集合,迭代器可能已经足够了。 http://en.cppreference.com/w/cpp/container/set指定set的迭代器类型为&#34; Constant Bidirectional Iterator&#34;这意味着你无法分配给它。要使用内置类型的另一个候选者是Container,但是我无法找到任何类型的Container支持插入,它可以同时用于向量和集合。

这个的基本原因是矢量和集合表现不同。向量定义元素的顺序并支持重复。不要做任何事情。

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