2014-11-25 62 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