用于std :: set的std :: back_inserter?

rlb*_*ond 85 c++ algorithm stl

我想这是一个简单的问题.我需要做这样的事情:

std::set<int> s1, s2;
s1 = getAnExcitingSet();
std::transform(s1.begin(), s1.end(), std::back_inserter(s2), ExcitingUnaryFunctor());
Run Code Online (Sandbox Code Playgroud)

当然,std::back_inserter因为没有,所以不起作用push_back. std::inserter还需要一个迭代器?我没有用过,std::inserter所以我不知道该怎么做.

有没有人有想法?


当然,我的另一个选择是使用向量s2,然后稍后对其进行排序.也许那更好?

Joh*_*itb 126

set没有push_back因为元素的位置是由集合的比较器决定的.使用std::inserter并传递它.begin():

std::set<int> s1, s2;
s1 = getAnExcitingSet();
transform(s1.begin(), s1.end(), 
          std::inserter(s2, s2.begin()), ExcitingUnaryFunctor());
Run Code Online (Sandbox Code Playgroud)

然后在插入迭代器将调用s2.insert(s2.begin(), x)其中x写入时它传递到迭代器的值.该集使用迭代器作为提示插入的位置.你也可以使用s2.end().

  • @NHDaly:因为back_inserter更快 (6认同)
  • 既然 `inserter(vec, vec.end())` 也适用于向量,为什么有人首先使用 back_inserter? (2认同)
  • @FelixDombek你是对的,不会慢很多。v.insert(x,v.end())在开头将有一个额外的分支(由于它移动了n个元素,但此处n为零)。但是,使用“插入器” 1)传达的意图与使用“推回” 2)传达不同的意图,这会使读者停下来并认为3)是过早的悲观化。 (2认同)