2010-12-22 159 views
-6

我有兩個數組,例如A = {1,2,3,4,5}和B = {5,6,3,4,5}。我想比較這兩個數組,並告訴A中有多少元素比B少,反之亦然,也可能是元素位置較小。我可以使用嵌套循環來做到這一點,但在C++中有沒有一種有效的方法來做到這一點?比較兩個數組

在這個例子中, A = {1,2,3,4,5} B = {5,6,3,4,5}

因此,我希望的答案是「B是大於A「,只是因爲它滿足了兩個元素中它更大的條件。或者如果它是

A = {1,2,3,4,5}和B = {1,2,3,0,4},A更大。

我只需要比較數量大小的元素,而不是本身的值。

對不起,我的含糊不清。

+0

如果您發佈您的低效代碼,我們可以幫助您改進它。 – 2010-12-22 16:28:52

+0

http://stackoverflow.com/questions/2903394/how-to-compare-two-vectors-in-c – karlphillip 2010-12-22 16:30:03

+4

到目前爲止,四分之三的答案都不確定你的意思。將此作爲提示,通過明確指定您想要的內容來改善您的問題。 – sbi 2010-12-22 16:35:04

回答

1

你想比較A和B的相應元素並計算有多少A'小於匹配的B?這可以用STD來完成:: inner_product這樣的:

int A[] = { 1,2,3,4,5 }; 
int B[] = { 5,6,3,4,5 }; 

int count = std::inner_product(A, A+5, B, 0, std::plus<int>(), std::less<int>()); 

std::cout << count << "\n"; 

當然,這只是一個爲O​​(n)的STL數字算法內部循環。

1

目前尚不清楚你的意思。你的意思是比較元素明智嗎?

vector<int> indexesForA; 
vector<int> indexesForB; 
for(int i = 0; i < length; i++) { 
    if(A[i] < B[i]) { 
     indexesForA.push_back(i); 
    } 
    else if(B[i] < A[i]) { 
     indexesForB.push_back(i); 
    } 
} 

// now indexesForA.size() is the count of indexes i where A[i] < B[i] 
// and indexesForA contains the indexes 
// similarly for indexesForB 

請發表一個澄清,我們可以引導你。

0
int A[5] = {1,2,3,4,5}; 
int B[5] = {5,6,3,2,4}; 

std::vector<int> vectA(A); 
std::vector<int> vectB(B); 

並使用標準<algorithm>在兩個向量上完成作業或部分作業。

例如: count_if返回範圍內滿足條件(函數模板)元素的個數

0

你是什麼意思?你的意思是A [i] < B [i]還是你的意思是B中有多少元素少於A [i]?要麼你會有一個循環,你要比較每個數組的第i個元素,或者你將有一個嵌套循環,在這裏你將A的第i個元素和B的第j個元素進行比較。因爲我沒有知道你想要哪一個,我不能告訴你正確的答案。

0

我認爲最有效的方法是首先對數組進行排序,然後檢查哪個索引是數組B的第一個元素大於其A對應元素。由於順序是可傳遞的,所以您甚至可以爲同一遍中的所有元素執行此操作。

1

這是我的例子。也許它可能會使用更先進的STL技術,但我認爲這足夠了。

class Examiner 
{ 
    template <class Pred> 
    struct CompareToZero: std::unary_function<const int&, bool> { 
     Pred comparator; 
     bool operator() (const int& value) const { 
      return comparator(value, 0); 
     } 
    }; 
    template<class T> 
    std::vector<size_t> getComparedIndices(const CompareToZero<T>& comparator, const std::vector<int>& vint) const { 
     std::vector<size_t> retval; 
     for (size_t i = 0; i < vint.size(); i++) { 
      if (comparator(vint[i])) 
       retval.push_back(i); 
     } 
     return retval; 
    } 
    const std::vector<int>& _results; 

public: 
    Examiner(const std::vector<int>& results) 
     : _results(results) { 
    } 

    std::vector<size_t> getLessIndices() const {   
     return getComparedIndices(CompareToZero<std::less<int> >(), _results); 
    } 
    std::vector<size_t> getGreaterIndices() const { 
     return getComparedIndices(CompareToZero<std::greater<int> >(), _results); 
    } 
    std::vector<size_t> getEqualIndices() const { 
     return getComparedIndices(CompareToZero<std::equal_to<int> >(), _results); 
    } 
    size_t getLessCount() const { 
     return getLessIndices().size(); 
    } 
    size_t getGreaterCount() const { 
     return getGreaterIndices().size(); 
    } 
    size_t getEqualCount() const { 
     return getEqualIndices().size(); 
    } 
}; 


void arrcomp() 
{ 
    int A[5] = {1,2,3,4,5}; 
    int B[5] = {5,6,3,2,4}; 

    std::vector<int> results(sizeof(A)/sizeof(A[0])); 
    for (size_t i = 0; i < results.size(); ++i) { 
     results[i] = 
      (A[i] < B[i])? -1: 
       (A[i] > B[i])? 0: 
        1;    
    } 
    Examiner examiner(results); 

    std::cout << "less count : " << examiner.getLessCount() << std::endl; 
    std::cout << "greater count: " << examiner.getGreaterCount() << std::endl; 
    std::cout << "equal count : " << examiner.getEqualCount() << std::endl;  
}