2

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

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++ 还是很陌生,所以对我现有函数的任何评论也将不胜感激。

非常感谢。

4

2 回答 2

6

其中一些已经存在并且在算法头中:

  • set_union
  • set_difference
  • set_intersection
  • set_symmetric_difference

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

见:http ://www.cplusplus.com/reference/algorithm/

于 2011-06-09T12:38:53.867 回答
3

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

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

插入 STL/CLR 容器的所有引用类型必须至少具有以下元素:

公共复制构造函数。

公共赋值运算符。

公共析构函数。

此外,set 和 map 等关联容器必须定义公共比较运算符,默认为 operator<。容器上的某些操作可能还需要定义公共默认构造函数和公共等价运算符。

与引用类型一样,要插入关联容器的引用类型的值类型和句柄必须定义比较运算符,例如 operator<。对于值类型或引用类型的句柄,不存在对公共复制构造函数、公共赋值运算符和公共析构函数的要求。

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

于 2011-06-09T12:31:36.990 回答