2016-05-15 98 views
-5
#include <iostream> 
#include <array> 
#include <algorithm> 
#include <cstring> 

using namespace std; 

int main() { 
    array<char, 20> test{"HelloWorld"}, tmp; 

    // method 1 
    tmp = test; 
    sort(tmp.begin(), tmp.begin() + strlen(tmp.begin())); 
    cout << "result: " << tmp.data() << endl; 

    // method 2 
    tmp = test; 
    sort(tmp.begin(), tmp.end()); 
    cout << "result: " << tmp.data() << endl; 

    return 0; 
} 

std::array可以用方法1進行排序。但它很難看。如何使用std :: sort對std :: array進行排序?

我更喜歡方法2,但什麼都不能返回。它出什麼問題了?

+1

這兩個'sort'調用做不同的事情。使用你需要的那個。 –

+3

這裏的根本問題是你試圖讓'std :: array'成爲'std :: string'。這不是,而且試圖用它作爲一個永遠不會很好的工作。 –

+0

爲什麼不使用'std :: string'?然後方法2將正常工作。 –

回答

4

第二種方法是將所有的\0元素排序到前面。 (他們比任何其他字符少

當你試着和.data()打印你得到一個char const*對象返回其在流類是像一個C字符串處理。這是一個空結束的字符串由於第一個字符是空不打印輸出。

您可以用

auto cmp = [](char a, char b) { return a != '\0' && a<b; } 
    sort(tmp.begin(), tmp.end(), cmp); 

解決這個使用其在最後排序\0比較。

但正如Jerry Coffin在評論中所說,std::array不是std::string - 使用符合您需要的那個(在這種情況下可能爲std::string)。

+0

@LokiAstari:謝謝你的加入 - 那會好很多。 –

2

您正在打印一個C字符串,該字符串依賴於終止空字符的存在:\0
當您對整個數組進行排序時,將該空字符移動到前面,這會告訴打印函數它是一個空字符串。

因此,你別無選擇,只能使用醜陋的版本。話雖這麼說,這裏是寫它,你可能更喜歡一個更安全的方式:

sort(tmp.begin(), find(tmp.begin(), tmp.end(), '\0')); 
+0

不知道如何更乾淨。 –

+0

@BenjaminLindley'tmp.begin()+ strlen(tmp.begin())'做了額外的工作。 –

+0

那是什麼工作?如果我不得不猜測哪一個能夠做更多的工作,那麼它就是你的版本,因爲它需要比較迭代器本身(到最終迭代器)的值以及取消引用的值(到0)。而'strlen'只檢查解除引用的值。 –

-2

,你可以把它寫這樣sort(tmp.begin(), tmp.end());

tmp.begin():返回一個迭代器到開始。
tmp.end():返回一個迭代器到最後。

他們是(公共成員函數)

+0

這正是OP在方法2中所說的,但結果並不如人意。 –