合并两个std :: set和(还没有)std :: set :: merge()

时间:2016-08-04 15:19:57

标签: c++ c++-standard-library c++17

我刚写了这段代码:

// Somewhere earlier, the equivalent of this happens.
std::set<T> a;
std::set<T> b;
FillMeUp(a);
FillMeUp(b);

// Later, in another function that sees a and b, this happens.
std::set<T> c;
std::set_union(a.begin(), a.end(),
               b.begin(), b.end(),
               std::inserter(c, c.begin()));
a.swap(c);

关键是在某些情况下,第二位代码想要将ab合并到a

(为了激励:我有一组带有集合的对象。我遍历那个数组。如果满足某个条件,我所看到的对象基本上复制了我之前看到的对象,所以我想要将其集合合并到之前的集合中。)

在C ++ 17中有一个名为std::set::merge的新函数,但我的g ++ 5.3.1显然不知道它(用-std = c ++ 17调用g ++ 5.3.1)。 / p>

问题,我真的可以做得比我做的更好吗?

1 个答案:

答案 0 :(得分:4)

正式地,std::set::merge中定义了insert

  

尝试提取a2中的每个元素并将其插入到使用中   a的比较对象。在具有唯一键的容器中,如果有   a中的元素与等效于a2中元素的键的键,   然后该元素不是从a2中提取的。

复杂性:

  

N log(a.size()+ N)其中N的值为a2.size()。

因为这与template< class InputIt > void insert( InputIt first, InputIt last );

的一个重载的复杂性相匹配
insert

这听起来像是a.insert(b.begin(), b.end());

的美化包装
//variables

var textElement = document.querySelectorAll(".service");
var yScroll = window.scrollTop;
var yPos = textElement.offsetTop / 2;

// function

function scrollFun() {
  if (yScroll > yPos) {
    textElement.style.opacity = '1';
    console.log(yPos);
  } else {
    textElement.style.opacity = '0';
  }
}

window.addEventListener("scroll", scrollFun);