0

我正在尝试做简单的集合交集,它工作正常,但是当输出来时,它只显示内存地址或垃圾随机值,帮助我,我应用了断点,但它不工作。实际上我是 C++ 新手

#include<iostream>
using namespace std;

class set
{
private:
    int size;
    int *elem;

public:
    set()
    {
        size = 0;
        elem = NULL;
    }
    set(int s);
    ~set();
    set(set &s);
    set intersection(set A, int z);
    void inputset();
    void outputset();
};

set::set(int s)
{
    size = s;
    elem = new int[s];
}

void set::inputset()
{
    int i;
    cout << "Enter the set  Element" << endl;
    for(i = 0 ; i < size ; i++)
    {
        cin >> elem[i];
    }
}
set set::intersection(set A, int z)
{
    int i, j, k = 0;
    set R(z);
    for(i = 0; i < size; i++)
    {
        for(j = 0; j < A.size; j++)
        {
            if(elem[i] == A.elem[j])
            {
                R.elem[k] = A.elem[j];
                k++;
                break;
            }
        }
    }
    return R;
}

set::~set()
{
    delete []elem;
}

set::set(set &s)
{
    int i;
    if(size > 0)
    {
        delete []elem;
    }
    size = s.size;
    elem = new int[size];
    for(i = 0; i < size; i++)
    {
        elem[i] = s.elem[i];
    }
}

void set::outputset()
{
    int i;
    cout << "The elements of new set is :  " << endl;
    for(i = 0; i < size; i++)
    {
        cout << elem[i] << endl;
    }
    cout << endl;
}


int main()
{
    int x, y, z;
    char choice;
    cout << "Enter sizeof set A" << endl;
    cin >> x;
    set S1(x);
    S1.inputset();
    S1.outputset();
    cout << "Enter sizeof set B" << endl;
    cin >> y;
    set S2(y);
    S2.inputset();
    S2.outputset();
    z = x + y;
    set S3(z);
    cout << "Enter I for intersection" << endl << "Enter U for union" << endl << "Enter D for     difference" << endl;
    cin >> choice;
    switch(choice)
    {
    case'I':
        S3 = S1.intersection(S2, z);
        S3.outputset();
        break;
    default:
        cout << "Invalid entry";
    }
    return 0;
}
4

3 回答 3

0

应该设置您的复制 ctor( const set &s); 而不是 set(set &s); 你所拥有的是一个接受对集合的引用的 ctor,它不是一个复制 ctor。因此编译器会为您生成默认值,并且您在从方法 intersection() 中按值返回对象时遇到问题另外请修复您的代码缩进,这不容易阅读。

还要从“复制 ctor”中删除以下行:

if(size>0)
{
    delete []elem;
}

您无法删除该指针,您的对象尚未构造。

于 2013-10-02T18:45:36.300 回答
0

有几种方法可以检查两个集合之间的交集,如果你的集合在数组中,我建议循环其中一个并检查它是否在另一个之间:

for (int i = 0; i < element1_size; i++) {
  for (int u = 0; u < element2_size; u++) {
    if (element1[i] == element2[u]) {
      cout << "Intersection point : " << element1[i] << endl;
    }
  }
}
于 2013-10-02T18:46:07.853 回答
0

如何使用地图以更有效的方式跟踪“相交”元素。这是我想到的一个片段:

std::map<int, int> m;
for(int i = 0; i < size; ++i)
  m.insert( std::pair<int, int>(elem[i], 1) );

for(int i = 0; i < A.size; ++i)
  if(m.count(A[i]) > 0)
    R.elem[k++] = A[i]

这样您就可以避免嵌套的 for 循环,并且能够以对数时间复杂度计算交集。

于 2013-10-02T19:19:49.853 回答