【问题标题】:Implementing union operation for two sets given as arrays对作为数组给出的两个集合实现联合操作
【发布时间】:2020-12-22 07:10:16
【问题描述】:

我需要创建一个包含两个集合的联合数组,以 C 数组的形式给出。 这是我到目前为止所拥有的。我认为我的 if 条件是正确的,但输出只打印出一组该数组。 你能指出我做错了什么吗?

#include "union_intersection.h"
#include <iostream>
using namespace std;


template <typename T>
void Union(T* left,   int left_size,
           T* right,  int right_size,
           T* result, int& result_size)
{
    
    int i=0, j=0;
    while (i< left_size && j <right_size){
        if (left < right)
        {
            result = left;
            cout<< *result<< "\t";
            i++;
            left++;
            result_size++;
        }
        else if (right<left)
        {
            result =right;
            cout<< *result << "\t";
            j++;
            right++;
            result_size++;
        }
        else
        {
           result =left;
           cout<< *result <<"\t";
           i++; j++;
           left++;
           right++;
           result_size++;
        }

    }
    
}

【问题讨论】:

标签: c++ arrays set-operations


【解决方案1】:
  • 您是在比较指针,而不是指向的内容。
  • 当它到达一个数组的末尾时,其他数组的内容将被忽略,因为while 中的条件要求两个数组都剩余一些元素。

试试这个:

#include "union_intersection.h"
#include <iostream>
using namespace std;


template <typename T>
void Union(T* left, int left_size, T* right,
               int right_size, T* result, int& result_size)
{
    
    int i=0, j=0;
    while (i< left_size || j <right_size){ // change condition to "at least one array have unprocessed elements"
        if (j >= right_size || *left < *right) // compare what is pointed at, and add condition "reached at end of one array"
        {
            result = left;
            cout<< *result<< "\t";
            i++;
            left++;
            result_size++;
        }
        else if (i >= left_size || *right<*left) // compare what is pointed at, and add condition "reached at end of one array"
        {
            result =right;
            cout<< *result << "\t";
            j++;
            right++;
            result_size++;
        }
        else
        {
            result =left;
            cout<< *result <<"\t";
           i++; j++;
           left++;
           right++;
           result_size++;
        }

    }
    
}

同样,参数result 的值被忽略并用作简单的局部变量看起来很奇怪,但我不认为这是无效的,因为问题只涉及打印输出并且没有关于应该做什么的规范对result所指向的内容进行写入或读取。

【讨论】:

    【解决方案2】:

    在@MikeCat 的帮助下,下面是我的完成功能。 我还包括循环以打印出剩余的元素。

    template <typename T>
    void Union(T* left, int left_size, T* right,
                   int right_size, T* result, int& result_size)
    {
    
        int i=0, j=0;
        while (i< left_size && j <right_size){
            if (*left < *right || j >=right_size)
            {
                result = left;
                cout<< *result<< "\t";
                i++;
                left++;
                result_size++;
            }
            else if (*right<*left || i>= left_size)
            {
                result =right;
                cout<< *result << "\t";
                j++;
                right++;
                result_size++;
            }
            else
            {
                result =left;
                cout<< *result <<"\t";
               i++; j++;
               left++;
               right++;
               result_size++;
            }
    
        }
        while (i < left_size)
        {
            cout<< *left<< "\t";
            left++;
            ++i;
            result_size++;
        }
        while (j < right_size)
        {
            cout<< *right<< "\t";
            ++j;
            right++;
            result_size++;
        }
    
    }
    

    【讨论】:

      猜你喜欢
      • 2023-03-08
      • 2021-04-17
      • 2021-06-21
      • 1970-01-01
      • 2016-02-02
      • 1970-01-01
      • 2018-12-07
      • 1970-01-01
      • 2014-08-26
      相关资源
      最近更新 更多