设置仅在C ++中添加第一个元素

时间:2015-03-05 19:34:34

标签: c++ set

我有以下代码:

#include <iostream>
#include <set>
#include <string>
#include <vector>
using namespace std;

class Tuple : public vector<string> {
private:
    vector <string> values; //hold values
public:
    Tuple(){};
    ~Tuple(){};

    void add(string val);
    void print();
};

void Tuple::add(string val) {
    values.push_back(val);
}
void Tuple::print() {
    for (unsigned int i = 0; i < values.size(); i++) {
        cout << values[i] << "\t";
    }
}

int main() {
set<Tuple> temp;
Tuple t1, t2, t3;
t1.add("a");
t1.add("b");
t2.add("c");
t2.add("d");
t3.add("c");
t3.add("a");
temp.insert(t1);
temp.insert(t2);
temp.insert(t3);

set<Tuple>::iterator it;
cout << temp.size() << endl;
for (it = temp.begin(); it != temp.end(); it++) {
    Tuple temp = *it;
    temp.print();
}
return 0;
}

并输出以下内容:

1
a    b

一个元组,或多或少是一个字符串向量。我知道集合不允许重复,但有些混淆为什么它不会广告“c d”或“c a”,因为它们是唯一的。

2 个答案:

答案 0 :(得分:3)

您继承自vector<string>,并且您还有一个成员vector<string>对象。现在的问题是你的add函数附加到成员对象。但是您的比较运算符是由标准库定义的运算符,并作用于基矢量。它对你的成员向量一无所知。因此,所有对象都被operator<视为空(因此彼此相等)。因此,set认为它们都是相同的,因此不会在第一个之后插入任何内容。

答案 1 :(得分:1)

如果要将元组定义为字符串向量,可能最简单的解决方案是使用typedef

typedef std::vector<std::string> Tuple;

这将允许您使用字符串向量的所有功能,而无需编写新代码。

BTW,std::vector确实有comparison operators重载。