2011-09-05 65 views
0

這裏是C++樣品排序一個數組和其他數組?

int a[1000] = {3,1,5,4} 
int b[1000] = {7,9,11,3} 

如何使它所以如果我排序陣列,數組b也下列陣列的

例如

a[1000] = {1,3,4,5} 
b[1000] = {9,7,3,11} 

是它能夠利用分類功能

sort(a,a+4) 

但是還排序數組b又如何?

編輯:如果有3個數組呢?

+1

你用索引排序。請參閱http://stackoverflow.com/questions/1577475/c-sorting-and-keeping-track-of-indexes –

+0

爲什麼不調用sort()兩次? – ben

+0

@ben因爲b沒有排序。它的重新排列方式與之前一樣。 –

回答

1

而不是使用兩個數組,您可以使用pair s的數組,然後使用特殊的比較函子而不是默認的小於運算符來排序THAT?

+0

如果有3個數組,有什麼可以使用這種方法? – zeulb

+0

那麼在這種情況下你需要一個3元組(或者自己寫一個結構體),但基本上可以肯定。 – Voo

0

最簡單的方法是將數據重新排列爲結構數組而不是一對數組,以便每個數據都是連續的;那麼,你可以使用適當的比較器。例如:

struct CompareFirst 
{ 
    bool operator() (const std::pair<int,int>& lhs, const std::pair<int,int>& rhs) 
    { 
     return lhs.first < rhs.first; 
    } 
}; 

// c[i].first contains a[i], c[i].second contains b[i] for all i 
std::pair<int, int> c[1000]; 
std::sort(c, c+1000, CompareFirst()); 

如果您不能重構你的數據一樣,那麼你需要定義充當RandomAccessIterator自定義類:

struct ParallalArraySortHelper 
{ 
    ParallelArraySortHelper(int *first, int *second) 
     : a(first), b(second) 
    { 
    } 

    int& operator[] (int index) { return a[index]; } 
    int operator[] const (int index) { return a[index]; } 

    ParallelArraySortHelper operator += (int distance) 
    { 
     a += distance; 
     b += distance; 
     return *this; 
    } 
    // etc. 
    // Rest of the RandomAccessIterator requirements left as an exercise 

    int *a; 
    int *b; 
}; 
... 
int a[1000] = {...}; 
int b[1000] = {...}; 
std::sort(ParallalArraySortHelper(a, b), ParallelArraySortHelper(a+1000, b+1000)); 
0

生成一個數組的大小相同原始,包含索引到數組中:{0, 1, 2, 3}。現在使用一個自定義比較函數來比較關聯數組中的元素而不是索引本身。

template<typename T> 
class CompareIndices 
{ 
public: 
    CompareIndices(const T * array) : m_AssociatedArray(array) {} 
    bool operator() (int left, int right) const 
    { 
     return std::less(m_AssociatedArray[left], m_AssociatedArray[right]); 
    } 
private: 
    const T * m_AssociatedArray; 
}; 

std::sort(i, i+4, CompareIndices(a)); 

一旦你有指標的排序列表,你可以將它應用到原始數組a,或任何你想要的其他b陣列。