2012-03-12 96 views
1

我在比較兩個向量中的值時遇到了問題。向量迭代器比較

以下是我的程序的示例代碼:

template <typename T> bool CompareVectors(std::vector<T> vector1, std::vector<T> vector2) 
    { 
    std::sort(vector1.begin(),vector1.end()); 
    std::sort(vector2.begin(),vector2.end()); 
    if (vector1.size() != vector2.size()) 
     return false; 
    else 
    { 
     bool found = false; 
     std::vector<T>::iterator it; 
     std::vector<T>::iterator it2; 
     for (it = vector1.begin();it != vector1.end(); it++) 
     {  
     for(it2 = vector2.begin(); it2 != vector2.end(); it2++) 
     { 
      if(it == it2) // here i have to check the values in the itearators are equal. 
      { 
      found = true; 
      break; 
      } 
     } 
     if(!found) 
      return false; 
     else 
      found = false; 
     } 
     return true; 
    } 
    }; 

在此示例代碼中,我有兩個向量進行比較。爲此,我使用std::sort()對兩個向量進行了排序。由於向量中的數據類型是模板(我在向量中使用類對象),因此std::sort()無法正常工作。也就是說,有時這兩個向量在排序後給出不同的元素順序。

所以我不能使用std::equal()函數也。

對於另一種解決方案,我已經爲twi向量使用了兩個迭代器。

並迭代一個矢量並在另一個矢量中搜索該元素。爲此迭代器比較是不可用的。

+0

你是如何實現'operator <'進行排序的?這可能是你的問題...我敢打賭,你有一個指針向量,你的項目按照他們的地址而不是他們的值進行排序。 – 2012-03-12 04:55:44

+0

您是否爲您正在使用的類定義了「<」和「==」運算符? – howardh 2012-03-12 04:56:42

+0

yaa我定義了==,<,!=運算符爲我正在使用的類 是的......我在向量中使用poinetr元素進行比較。因此,std :: sorting的問題。所以它是按地址排序的。 – 2012-03-12 05:03:16

回答

2

您第一次使用typename的關鍵字:

typename std::vector<T>::iterator it; 
typename std::vector<T>::iterator it2; 

沒有typename你的代碼甚至不會編譯。

爲了比較通過迭代器指向的,你要做到這一點:

if(*it == *it2) 

你可以寫你比較功能:

//changed the name from CompareVectors() to equal() 
template <typename T> 
bool equal(std::vector<T> v1, std::vector<T> v2) 
{ 
    std::sort(v1.begin(),v1.end()); 
    std::sort(v2.begin(),v2.end()); 
    if (v1.size() != v2.size()) 
     return false; 
    return std::equal(v1.begin(),v1.end(), v2.begin()); 
}; 
+1

是的......很好的思考..............非常感謝。 – 2012-03-12 05:15:39

+0

而不是測試大小,然後調用'std :: equal',你可以簡單地說'return v1 == v2;' – Blastfurnace 2012-03-12 05:20:29

+0

@Blastfurnace:這很好。我不知道存在'=='非成員函數來測試兩個向量的相等性。 – Nawaz 2012-03-12 05:24:05

0

若本線:

if(it == it2) 

if (*it == *it2) 

第一行是比較指針而不是值。

0

這裏有很多問題。首先,你說std::sort()不起作用。你是否爲你的班級重載operator<

此外,您還需要比較一下迭代器是指向到:

*it == *it2 

此外,你需要通過在同一時間(只有一個循環)兩個數組遍歷:

for (it = vector1.begin(), it2 = vector2.begin(); 
    it != vector1.end(), it2 != vector2.end(); 
    it++, it2++) { 
    ... 
} 

雖然確實如此,但您應該只是通過重載operator==來使用std::equal()

從效率的角度來看,您應該比較size()之前您打擾排序陣列。