簡體   English   中英

兩個排序列表的交集和並集(返回類型)

[英]Intersection and Union of two sorted lists (return type)

此代碼用於查找兩個排序列表的交集和並集。 從具有所有基本功能的列表類繼承的排序列表。 主要問題是該函數的返回類型是什么。 它是指向列表還是列表本身的指針? 我將如何顯示該“指針”的內容。

template <typename Object>
class sorted_list : public List<Object>{
    friend sorted_list<Object>*& slUnion( const sorted_list<Object>& list1, const sorted_list<Object> & list2){
        auto i=list1.begin();
        auto j=list2.begin();
        sorted_list<Object> un;
        static sorted_list<Object>* newlist=&un;
        while(i!=list1.end() && j!=list2.end()){
            if(*i<*j){
                un.push_back(*i);
                i++;
            }
            else if(*i>*j){
                un.push_back(*j);
                j++;
            }
            else{ //if equal
                un.push_back(*i);
                i++; j++;
            }
        }
        while(i!=list1.end())
            un.push_back(*i++);
        while(j!=list2.end())
            un.push_back(*j++);
        return newlist;
    }
};

程序運行時,main中的“ un”指向NULL。

int main(){
    sorted_list<int> l1;
    int i=1;
    while(i<10){
        l1.push_back(i++);
    }
    sorted_list<int>l2;
    int j=1;
    while(j<10){
        l2.push_back(j);
        j+=2;
    }
    sorted_list<int> *un = slUnion(l1,l2);
}

您通常應按值返回,即sorted_list<Object> 較新版本的cpp保證您實際上不會進行復制。

您現在正在做的事情是錯誤的,因為它具有未定義的行為。 您正在使用函數堆棧上的un ,並返回指向它的指針。 到函數返回時, un的作用域已超出范圍,並且內存位置可以被重用。 只需完全刪除newlist指針,然后返回un

您似乎也對類,方法和函數感到困惑。 照原樣,您的方法不必在類內部,或者,因為它似乎不使用類狀態,所以如果在類內部,則它可以是靜態的。 似乎也不必成為朋友。 如果您想將其編寫為成員函數,則看起來像這樣:

sorted_list<Object>& unionWith(const sorted_list<Object>& rhs) {
  // merge this and rhs w deduplication into temp, then swap temp with this
  ...

  return *this;
}

我認為您可能遇到的問題是,您沒有將&un分配給newlist ,而是使用&un初始化了newlist 初始化僅對函數靜態變量執行一次,因此方法的未來迭代僅跳過該行,並且指針指向un的原始版本所在的位置。 嘗試將作業放在另一行。 那應該可以解決您眼前的問題,但是使用靜態指針的解決方案仍然非常糟糕,因為所有實例都共享該指針。

暫無
暫無

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

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