2014-11-25 59 views
-1

我覺得我對冒泡排序有點困惑。但我的主要問題是將命令行參數轉換爲典型數組,而不是argv。在命令行參數上使用冒泡排序C++

我在想通過循環遍歷argv我可以puch.back到一個向量然後使用我的氣泡排序函數它向量。

我想從命令行中從A到Z順序,然後從Z到A順序進行排序。

任何與我的代碼的幫助,不勝感激。 請添加評論,以便我更好地理解爲什麼這對我來說很困難。

謝謝!

#include <cstdlib> 
#include <iostream> 
#include <vector> 

void swap(int [], int, int); 
void bubble_sort(std::string args[], int); 

void bubbleSort(std::string args[], int n) { 
    bool swapped = true; 
    int j = 0; 
    std::string tmp; 
    while (swapped) { 
     swapped = false; 
     j++; 
     for (int i = 0; i < n - j; i++) { 
      if (args[i] > args[i + 1]) { 
       tmp = args[i]; 
       args[i] = args[i + 1]; 
       args[i + 1] = tmp; 
       swapped = true; 
      } 
     } 
    } 
} 

int main(int argc, char * argv[]) 
{ 
    std::vector<std::string> args(argv, argv + argc); 

    for (int i = 0; i < argc; i++) 
    { 
     args.push_back(argv[i]); 

    } 
    long vector_size = args.size(); 

    bubble_sort(args,vector_size); 
    return 0; 
} 
+0

請解釋下投票,我將編輯我的問題。謝謝。 – wuno 2014-11-25 07:04:57

+0

我們不是編譯器。你已經發布了預期的行爲,但你還必須發佈你得到的結果(編譯器錯誤,錯誤的輸出等)。 – bolov 2014-11-25 07:46:06

回答

1

首先,你在混合數組和向量。我將回顧this頁面,瞭解如何聲明,初始化和使用向量。您正在創建中的std::vector,但將std::string[]傳遞到bubbleSort。這些不是同一類型。如果你想使用std::string[],那麼你需要在主聲明,而不是使用std::vectorstd::vector.push_back()

這樣的陣列,雖然你可以使用你的語法,我覺得這是一個很難理解它到底是什麼所以我建議用push_back()手動填充它,直到你更瞭解矢量。因此,如果使用載體,main看起來是這樣的:

int main(int argc, char * argv[]){ 
    std::vector<std::string> args; 

    for (int i = 0; i < argc; i++){ 
     args.push_back(argv[i]); 

    bubble_sort(args); // Don't really need to pass the length of args, since you can access it using .size() 
    // You probably want to actually print this out, for confirmation purposes. 
    for(int i = 0 ; i < args.size() ; i++) 
     cout << args[i] << endl; 
    return 0; 
} 

請記住,向量不按引用傳遞,所以如果你在bubbleSort做任何交換,這些變化將不會在主反映。通過引用學習傳遞是讀者的一個練習,但是你的bubbleSort函數簽名看起來像void bubbleSort(std::vector<std::string> &v)。請記住,如果您已經打算使用std功能,那麼使用自己的排序算法並不是真的值得(因爲已經有std::sort)。

另一種方式來做到這一點是使用普通的舊陣列,利用自己的排序算法,主要將沿着線的東西:

int main(int argc, char * argv[]){ 
    std::string *args = new string[argc]; 
    for(int i = 0 ; i < argc ; i++) 
     args[i] = argv[i]; 
    bubbleSort(args, argc); 
    for(int i = 0 ; i < argc ; i++) 
     cout << args[i] << endl; 
    return 0; 
} 

請記住,你不能得到的長度一個具有.size()函數的動態分配數組,因此您需要傳遞該長度。因此,bubbleSort的函數簽名看起來像這樣:void bubbleSort(string *args, int len)

+0

非常感謝您的幫助。我得到了它的工作。我對一部分感到困惑。我不明白如何進行排序。例如,如果我想將它從z更改爲no,具體說明它按照什麼順序排序? – wuno 2014-11-25 08:10:01

+0

我得到了它非常感謝你的幫助 – wuno 2014-11-25 08:21:13

+0

@NDiaz你應該仔細檢查[如何冒泡排序工作](http://en.wikipedia.org/wiki/Bubble_sort)!仔細觀察算法,並試圖找出需要改變的地方。提示:只需要更改一個字符。 – nchen24 2014-11-25 08:23:13

1

您需要先將輸入命令行參數轉換爲std :: string,然後您必須推回到數組。一旦你做到了,它會按預期工作。

int main(int argc, char * argv[]) 
{ 
    std::vector<std::string> args;//argVec(argv, argv + argc); 

    for (int i = 0; i < argc; i++) 
    { 
     std::string s = argv[i];//Converting Arguments to std::string 
     args.push_back(s); 
    } 
    long vector_size = args.size(); 

    bubble_Sort(args,vector_size); 
    return 0; 
} 

另外,如果你想使用std :: vector v(argv,argv + argc);那麼請參考以下鏈接

parsing argc and argv in c++

http://www.boost.org/doc/libs/1_41_0/doc/html/program_options.html