簡體   English   中英

集使用動態內存的並集

[英]Union of Sets using Dynamic Memory

下面有一段代碼。 我正在嘗試為集合創建一個聯合方法,並且應該調用element(int)方法來檢查正在創建的新集合中的所有元素,在這里將其稱為C。 我們不應該使用標准庫中的set聯合。 當我在主函數中調用A.Union(B)並顯示它時,程序僅顯示我輸入到Set A中的任何內容,但是應該返回我在我的集​​合中創建的新Set的所有內容。聯合函數。 如何獲得此函數以返回創建的新集合的所有內容,同時還要檢查元素以確保沒有重復的元素?

*旁注:我完全知道我的變量名,一旦了解如何更正此方法,我將對其進行更改。 我還是一個初學者,他真的很想學習,所以我很樂於接受建設性的批評,這樣我才能知道如何改進。 //默認構造函數

Set::Set ( int s ){

        if ( s > 0 )
                psize = s;
        else
                psize = DEFAULTSIZE;
        //allocate an array of specified size
        set = new int[ psize ];

        if(!set) {
                //send an error is system cannot allocate memory
                cout << "Cannot Allocate Memory, exiting program... " << endl;
                exit (1);
        }

        for ( int i = 0; i < psize; i++){
                set[i] = 0;
                numOfElements = 0;
        }
}
bool Set::element ( int n ){
                 for ( int i = 0; i < psize; i++){
                            if ( set[i] == n )
                                    return true;
                    }
                    return false;
            }

         Set Set::Union( Set &B ){
                int newsize = B.numOfElements + numOfElements;

                Set C(newsize);

                for (int i = 0; i < numOfElements; i++){
                        C.set[i] = set[i];
                }

                int indx = 0;
                for(int i = 0; i < B.numOfElements; i ++){
                        if(C.element(B.set[i])){
                                newsize--;
                                continue;
                        }
                        else
                        {
                                C.set[indx + numOfElements] = B.set[i];
                                indx++;
                        }
                }

                C.numOfElements = newsize;
                C.display();
                return (C);
        }
        Set Set::Intersection( Set &B ) {

                int newsize = numOfElements;

                Set C(newsize);
                        for ( int i = 0; i < numOfElements; i++ ){
                                if( element(B.set[i]))
                                        C.set[i] = B.set[i];
                                else{
                                        newsize--;
                                        continue;
                                }
                        }
                return (C);
        }
   Set Set::operator-( int n ){
            for ( int i = 0; i < numOfElements; i++){
                    if(element(n)){
                            delete set[i];
                            numOfElements--;
                    }
            }
            psize = numOfElements;

            return (*this);
    }


            main (){

                    Set A, B, C;
                    A.input();
                    A.display();
                    B.input();
                    B.display();
                    C = A.Union(B);
                    C.display();
            }

如果n等於集合的最后一個元素,則Set::element返回false 否則返回true 那可能不是您想要的。

此外newsize應該是B.psize + psize只有當你添加從兩套所有元素。 但是,如果AB中都包含某些元素,則不會添加所有元素。

而且, main函數缺少返回類型。

當我在主函數中調用A.Union(B)並顯示它時,程序僅顯示我輸入到Set A中的任何內容

但是您永遠不會顯示A.Union(B) A.display()后,您調用A.display() 毫不奇怪,它顯示您輸入到Set A中的內容 您甚至從未將Set::Union返回的Set::Union存儲在變量中。

首先,最重要的是,僅此一項就可以解決當前的問題,您的Union方法似乎應該提供正確的結果,但是會返回一個新集合。 因此,如果您想正確使用它,則可以執行以下操作:

C = A.Union(B);
C.display();

...或更簡潔:

A.Union(B).display();

當你寫:

A.Union(B);

...您正在計算並集,該函數返回該值,但是您沒有捕獲它,因此它被扔掉了,並且代碼基本上什么都不做(就副作用而言)。

同樣,這只是另一件事,不會影響正確性:

bool Set::element ( int n ) {
        bool validate = true;
        for ( int i = 0; i < psize; i++){
                if ( set[i] == n )
                        validate = false;
        }
        return (validate);
}

...這部分可以簡單地是:

bool Set::element ( int n ) {
        for ( int i = 0; i < psize; i++){
                if ( set[i] == n )
                        return false;
        }
        return true;
}

它效率更高,因為它會在找到匹配項時退出該函數,並且在找到匹配項后不會繼續不必要地搜索集合的其余部分。

但更重要的是,處理國家很難。 函數中具有的變量越多,通常得到的錯誤就越多。 因此,如果您知道如何避免這種情況,請盡量不要引入超出所需數量的變量,這樣會使您的生活更輕松。

如果此element函數在查找元素時返回true而不是false,則可能更容易理解該element函數,但這取決於您。

最后但並非最不重要的一點是,我強烈建議您學習目前使用的任何編譯器的調試器。 如果您想要某種類似於法律“作弊”的東西,從而使您比其他學生更有優勢,並且讓您與您的代碼在每一小步中正在做的事情和問題有什么聯系,請學習調試器並學習如何進行跟蹤您的代碼,並在任何給定時間查看變量的值。 了解了調試器后,許多這些問題將立即對您顯而易見,並且無需您撓頭並盯着代碼,直到您目不轉睛(盡管有時這也是有用的練習)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM