2013-02-04 53 views
0

我有一個我想按字母順序排列的向量。我已經成功地按字母順序排序了一個索引值,但是當我這樣做時,它只會改變索引的順序而不是整個向量。我如何才能將訂單更改應用於整個向量? 這是我當前的代碼我運行:按索引值按字母順序排序向量

std::sort (myvector[2].begin(), myvector[2].end(), compare); 

bool icompare_char(char c1, char c2) 
{ 
    return std::toupper(c1) < std::toupper(c2); 
} 

bool compare(std::string const& s1, std::string const& s2) 
{ 
    if (s1.length() > s2.length()) 
    return true; 
    if (s1.length() < s2.length()) 
    return false; 
    return std::lexicographical_compare(s1.begin(), s1.end(), 
             s2.begin(), s2.end(), 
             icompare_char); 
} 

我對這個矢量一般結構是向量[行] [列]其中:

| One | Two | Three | 
| 1 | 2 | 3 | 
| b | a | c | 

例如,如果我有一個向量:

myvector[0][0] = 'One' AND myvector[2][0]='b' 
myvector[0][1] = 'Two' AND myvector[2][1]='a' 
myvector[0][2] = 'Three' AND myvector[2][2]='c' 

| One | Two | Three | 
| 1 | 2 | 3 | 
| b | a | c | 

我整理我得到它:

myvector[0][0] = 'One' AND myvector[2][0]='a' 
myvector[0][1] = 'Two' AND myvector[2][1]='b' 
myvector[0][2] = 'Three' AND myvector[2][2]='c' 

| One | Two | Three | 
| 1 | 2 | 3 | 
| a | b | c | 

,而不是我想要的:

myvector[0][0] = 'Two' AND myvector[2][0]='a' 
myvector[0][1] = 'One' AND myvector[2][1]='b' 
myvector[0][2] = 'Three' AND myvector[2][2]='c' 

| Two | One | Three | 
| 2 | 1 | 3 | 
| a | b | c | 

我環顧四周,一個很好的辦法,但無法找到任何工作......我想是這樣的:

std::sort (myvector.begin(), myvector.end(), compare); 

然後處理的分類我的比較函數中的第三個索引,因此整個矢量將被編輯......但是當我傳遞了我的數據時,我只是改變了函數中的順序,仍然沒有更改頂層或出現錯誤。任何意見或幫助將不勝感激。先謝謝你。

+0

你正在離開'myvector [1] [...]'在我有什麼/我想要什麼描述。有什麼理由呢? – WhozCraig

+0

如果你想按第二個索引進行排序,那麼''2''應該出現在*'compare'中。這將對行進行排序,而不是像您所示的列,所以您應該調換數據。 –

+0

@whozCraig:我只是忽略了1個索引,以減少你們閱讀的次數。我只是用帶索引的矢量來描述基本結構。 –

回答

4

理想情況下,將3個數據字段合併到一個struct中,以便您可以只有一個矢量並對其進行簡單排序。

struct DataElement{ 
    std::string str; 
    char theChar; 
    int num; 
    bool operator<(const DataElement& other)const{return theChar<other.theChar;} 
}; 

std::vector<DataElement> myvector; 

std::sort (myvector.begin(), myvector.end()); 
+0

我之前沒有使用過結構,因爲我對C++很陌生。這個想法是有道理的,但讀一下後,我會參考像myvector [0] .str =「One」和myvector [0] .theChar =「b」和myvector [0] .num = 1?那麼我怎麼能夠通過myvector.theChar爲每個索引編輯我的排序? –

+0

@DevonBernard請參閱我的編輯,看看這是你想要的。它會按升序'theChar'的順序對整個列表進行排序。如果你不給比較函數,默認是使用'<'操作。 –

+0

@Kerthik T:好的,我剛剛實現了你的代碼,我成功地將所有的值插入到vector結構中。但是當我嘗試對它進行分類時,我會遇到一個非常長的錯誤。 –