【发布时间】:2020-02-21 13:13:19
【问题描述】:
我尝试用“-”来实现集合的差异。例如:
Set a = 1 2 3 4;
Set b = 3 4 5 6;
Set c = a - b; // (1 2);
我应该如何重载运算符?我尝试使用 frienldy 函数,但它不能与变量“大小”一起使用。 Visual Studio 在第 28 行显示错误“c2597”(大小++;) 我不明白,如何重载“-”以将其与两组一起使用。当我重载类的方法时,我只能使用一个参数。当我使用友元函数时,我可以使用两个参数(设置 a,设置 b),但我不能使用变量“大小”。
#include <iostream>
#include <locale.h>
#include <conio.h>
#include <vector>
using namespace std;
class Set {
private:
int size;
vector <int> vect;
public:
Set() { size = 0; }
~Set() { vect.clear(); }
void Enter();
void Show();
friend Set operator-(Set a, Set b)
{
size = 0;
vect.clear();
int i, j, n = 0;
for (i = 0; i < a.size; i++) {
int cnt = 0;
for (j = 0; j < b.size; j++)
{
if (a.vect[i] == b.vect[j]) cnt++;
}
if (cnt == 0) {
size++;
vect.push_back(a.vect[i]);
}
}
return a;
}
void add()
{
int element;
cout << "Введите новый элемент " << endl;
cin >> element;
size = size + 1;
vect.push_back(element);
}
};
void Set::Enter() {
cout << "Введите размер " << endl;
cin >> size;
vect.resize(size);
cout << "Введите элементы :" << endl;
for (int i = 0; i < size; i++)
{
cin >> vect[i];
}
}
void Set::Show() {
cout << "Множество: " << endl;
for (int i = 0; i < size; i++)
cout << vect[i] << " ";
cout << endl;
}
int main() {
setlocale(LC_ALL, "RUS");
Set a;
a.Enter();
Set b;
b.Enter();
Set c;
c = a - b;
c.Show();
c.add();
c.Show();
_getch();
return 0;
}
更新: 我通过方法做到了:
Set operator-(const Set& b)
{
Set a = *this;
Set tmp;
tmp.size = 0;
vect.clear();
int i, j, n = 0;
for (i = 0; i < a.size; i++) {
int cnt = 0;
for (j = 0; j < b.size; j++)
{
if (a.vect[i] == b.vect[j]) cnt++;
}
if (cnt == 0) {
tmp.size++;
tmp.vect.push_back(a.vect[i]);
}
}
return tmp;
}
【问题讨论】:
-
那么你想要的是set difference?
-
仅供参考:SO: how to find the intersection of two std::set in C++? 我重载了
*用于集合的交集,+用于集合的并集(只是为了好玩)。 -
您还有一些其他问题,例如运算符函数不是成员函数,这意味着它没有定义
vect或size变量。而且你总是返回a而不修改它。 -
请注意
std::vector已经有size()。 -
我试图返回一个,因为不明白,必须返回哪个方法))对不起我的英语)差异:{1,2,3} - {2,3,4} = { 1}
标签: c++ set operator-overloading