【问题标题】:C++ lazy way to find union of std::setsC++ 查找 std::sets 联合的懒惰方法
【发布时间】:2014-03-13 15:32:01
【问题描述】:

我想找到两个集合的并集,即将它们加在一起。我知道.insert()std::set_union(),但是,据我所知,这些要求首先获得第二组开头和结尾的迭代器(或更糟的是set_union())。如果我能做类似++= 的事情就好了;对于实现集合的数学概念的类来说,这似乎是一个相当明显的特征。最简单的方法是什么?

【问题讨论】:

  • 您能否展示一个您希望能够编写的代码示例?这个问题还不是很清楚。
  • set::beginset::end 具有恒定的时间复杂度。你对他们有什么看法?
  • @C.R.不够简洁
  • 我会定义一个命名空间lazy_stl,在那里根据std::set_union定义你的operator+并添加“使用命名空间lazy_stl;”无处不在 :) 编辑:嗯,第二个想法你可能不得不在 std 中定义它(这是不允许的 iirc)或显式范围它,这将破坏整个观点。 (由于 ADL)
  • 简短回答:不。但是,如果您真的觉得 s1.insert(s2.begin(),s2.end()) 太冗长,您可以自己轻松地编写它。

标签: c++ stl set add


【解决方案1】:

我不知道有什么方法可以用现有的 C++ 方法来简化它。

简化在整个容器上运行的容器算法的一种方法是将它们包装在接受容器的模板方法中:

template <typename T>
void my_union(const T& cont1, const T& cont2, T& cont3)
{
    // Make the union and store the result in cont3
}

如果你想为此有一个运算符,你可以自己轻松定义一个:

template <typename T>
inline set<T>& operator+=(set<T>& lhs, const set<T>& rhs)
{
    lhs.insert(begin(rhs), end(rhs));
    return lhs;
}

template <typename T>
inline set<T> operator+(set<T> lhs, const set<T>& rhs)
{
    lhs += rhs;
    return lhs;
}

int main() {
    set<int> a = {1, 2, 3   };
    set<int> b = {   2, 3, 4};

    a += b;

    for (auto i : a)
         cout << i << " ";

    return 0;
}

上面的例子会将1 2 3 4 打印到控制台。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-06-26
    • 2016-03-19
    • 1970-01-01
    • 2010-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多