我知道我可以这样做:
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
(这样可以在重复的情况下提供良好的错误报告)?这会是一个好方法吗?
谢谢!
答案 0 :(得分:3)
您没有push_back
或push_front
到set
,因为(概念上)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的一个提示,从哪里开始寻找放置物品的位置。
根据下面的评论,您还想要一种方法来检查插入项目的“处置”。也就是说,在插入项目之前判断项目是否已经存在的方法。
您无法直接使用 迭代器直接执行此操作。如果您需要此信息,您有两种选择。
1)不要使用插入迭代器。从[{1}}获取bool
的唯一方法是致电set::insert
。所以请致电set::insert
42)在插入之前和之后检查set::insert
的大小。如果大小增加1,则插入项目。 :)我把它推销为第42项,因为IMO不仅仅是因为多种原因而直接调用set
。可能存在多线程问题,计算insert
等可能会出现性能损失。
答案 1 :(得分:1)
您无法插入set
的“后退”或“前方”。也许您正在寻找的是std::inserter
。
答案 2 :(得分:1)
要使用front_insert_iterator
,容器必须定义成员push_front
(例如标准容器deque
和list
)。