我有以下代码:
#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”,因为它们是唯一的。
答案 0 :(得分:3)
您继承自vector<string>
,并且您还有一个成员vector<string>
对象。现在的问题是你的add
函数附加到成员对象。但是您的比较运算符是由标准库定义的运算符,并作用于基矢量。它对你的成员向量一无所知。因此,所有对象都被operator<
视为空(因此彼此相等)。因此,set
认为它们都是相同的,因此不会在第一个之后插入任何内容。
答案 1 :(得分:1)
如果要将元组定义为字符串向量,可能最简单的解决方案是使用typedef
:
typedef std::vector<std::string> Tuple;
这将允许您使用字符串向量的所有功能,而无需编写新代码。
BTW,std::vector
确实有comparison operators重载。