std :: set及其front_insert_iterator

时间:2010-11-16 20:25:59

标签: c++ stl

我知道我可以这样做:

std::vector<double> vec;
std::back_insert_iterator<std::vector<double> > it( back_inserter(vec) );
it = 4.5;

但我想对std::set执行类似的操作(在语法中)(并使用front_insert_iterator代替对该集的引用,并使用{{1 }})。有可能,还是我被迫使用该套装的参考?也许我应该使用set::insert和/或std::merge(这样可以在重复的情况下提供良好的错误报告)?这会是一个好方法吗?

谢谢!

3 个答案:

答案 0 :(得分:3)

您没有push_backpush_frontset,因为(概念上)set是一个已排序的关联容器。但是你可以这样做:

#include <cstdlib>
#include <set>
#include <iterator>
using namespace std;

int main()
{
    typedef set<int> MySet;
    MySet si;
    insert_iterator<MySet> it(si, si.begin());

    *it = 1;
    *it = 2;

}

编辑:

请注意,迭代器初始化的begin()而不是,其中元素被放置。相反,它是STL的一个提示,从哪里开始寻找放置物品的位置。

EDIT2:

根据下面的评论,您还想要一种方法来检查插入项目的“处置”。也就是说,在插入项目之前判断项目是否已经存在的方法。

您无法直接使用 迭代器直接执行此操作。如果您需要此信息,您有两种选择。

1)不要使用插入迭代器。从[{1}}获取bool的唯一方法是致电set::insert。所以请致电set::insert

42)在插入之前和之后检查set::insert的大小。如果大小增加1,则插入项目。 :)我把它推销为第42项,因为IMO不仅仅是因为多种原因而直接调用set。可能存在多线程问题,计算insert等可能会出现性能损失。

答案 1 :(得分:1)

您无法插入set的“后退”或“前方”。也许您正在寻找的是std::inserter

http://stdcxx.apache.org/doc/stdlibref/insert-iterator.html

答案 2 :(得分:1)

要使用front_insert_iterator,容器必须定义成员push_front(例如标准容器dequelist)。