[英]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.