通用集合操作类,即交集,并集,减去等

时间:2011-06-09 12:27:49

标签: c++ c set-operations

我想编写一个C ++类,它提供的set操作可以处理字符串向量和我自己数据类型的向量。有没有简单的方法可以做到这一点,而不是为每种数据类型编写不同的函数?到目前为止,我已经为字符串向量编写了操作下面显示了我的集合联盟的一个例子:

vector<string> SetOperations::set_union(vector<string> set1,
                                        vector<string> set2) {
    for(std::vector<int>::size_type i = 0; i < set1.size(); i++) {
        set1.push_back(set2.at(i));
    }
    return set1;
}

所以我又想要同样的事情,但stringmy_data_type,这是各种成员的结构。让我们说它看起来像这样:

struct my_data_type {
    int label;
    vector<string> x;
    vector<string> y;
    string str;
};

每种数据类型的函数也不会像我的set_union(...)函数那么简单,因为在集合交集的情况下,我确实需要在my_data_type的每个成员上测试相等性吗?

另外,我对C ++很陌生,所以对我现有功能的任何评论也会受到赞赏。

非常感谢。

2 个答案:

答案 0 :(得分:6)

其中一些已存在且位于算法标题中:

  • set_union
  • set_difference
  • set_intersection
  • set_symmetric_difference

这些都支持比较器功能,因此您可以对所有自己的数据类型执行此操作。或者在其他回复中发布,使您的容器符合STL要求。

请参阅:http://www.cplusplus.com/reference/algorithm/

答案 1 :(得分:3)

已经有这样的算法(联合,交集,排序......):http://www.cplusplus.com/reference/algorithm/

您的元素只需满足STL容器元素的要求(参见http://msdn.microsoft.com/fr-fr/library/bb385469.aspx):

  

插入的所有引用类型   进入STL / CLR容器必须有,at   至少,以下要素:

     

公共副本构造函数。

     

公共任务运营商。

     

公共析构函数。

     

此外,关联容器   如set和map必须有公共   比较运算符定义,即   运营商LT;默认情况下。一些操作   在容器上也可能需要一个   公共默认构造函数和   公共等值算子   定义

     

类似于引用类型,值类型和   处理引用类型   插入关联   容器必须有一个比较   运营商如运营商&lt;定义。   公共副本的要求   建设者,公共任务   运算符和公共析构函数   值类型或句柄不存在   引用类型。

您可以在该WikiBook上找到有关运算符重载(将在您的自定义类中实现)的信息:http://en.wikibooks.org/wiki/C++_Programming/Operators/Operator_Overloading