簡體   English   中英

嘗試覆蓋-=運算符時出現問題

[英]Trouble trying to override -= operator

因此,我有兩個對象,其中包含一個稱為“文件”的文件對象矢量(其中可能包含一個文件或一個目錄文件以及它指向的所有文件)。 如果我做類似B2-= B1的操作,我希望它從B2中刪除B1中的所有內容(如果適用)。 我通過檢查它們的ino_t inode和dev_t設備編號來比較文件對象是否相同。

目前這是我的代碼

Someclass& Someclass::operator-=(const Someclass &rhs){
    vector<AnotherClass> retfiles;
        for (auto i = 0; i < static_cast<int>(files.size()); i++){
            for (auto j = 0; j < static_cast<int (rhs.files.size()); j++){

            if (i < j){
                if (!isSameFile(files.at(i), rhs.files.at(i))){
                    retfiles.push_back(files.at(i));
                    }
            }
        }

    files = retfiles; 

    return *this;
}

bool Someclass::isSameFile(const AnotherClass &lhs, const AnotherClass &rhs) { 
    return (lhs.getInode() == rhs.getInode()) && (lhs.getDeviceNumber() == rhs.getDeviceNumber());
}

我的問題是,我無法正確地從左側成功刪除文件(在rhs對象可能包含比lhs對象更多的文件的情況下),或者在從向量中刪除重復項的情況下。

SomeClass 1:
-rw-r--r-- pub/tree/alpha/iota/omega
-r--r--r-- pub/tree/alpha/iota/kappa
drwxr-xr-x pub/tree/alpha/iota
SomeClass 2:
-rw-r--r-- pub/tree2/tau/sigma
drwxr-xr-x pub/tree2/tau
-rw-r--r-- /etc/group
SomeClass 3:


SomeClass3-=SomeClass2應該看起來像

-rw-r--r-- pub/tree/alpha/iota/omega
-r--r--r-- pub/tree/alpha/iota/kappa
drwxr-xr-x pub/tree/alpha/iota

從一個數組中找到另一個數組中不存在的元素稱為集合差異 ,標准庫中有一個函數可以做到這一點。

vector<AnotherClass> retfiles;
std::set_difference(files.begin(), files.end(),
                    rhs.files.begin(), rhs.files.end(),
                    std::back_inserter(retfiles), isSameFile);
// retfiles contains elements from files that didn't exists in rhs.files

您將需要#include <algorithm>用於set_difference#include <iterator>用於back_inserter

編輯:

實際上, isSameFile不能完全滿足set_difference的需要。 您將需要使用比較函數對數組進行排序,並將相同的函數用於set_difference。

在下面的評論中,如果只有getDeviceNumber可以區分文件,則cmp可以做到這一點,但是我也看到您也擁有getInode 因此,您可能需要進行如下比較功能:

bool cmp(const Fing &lhs, const Fing &rhs) { // typo?
    if (lhs.getDeviceNumber() != rhs.getDeviceNumber())
        return lhs.getDeviceNumber() < rhs.getDeviceNumber();
    else
        return lhs.getInode() < rhs.getInode();
}

並使用它進行排序並傳遞給set_difference。

暫無
暫無

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

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