在命令行参数c ++上使用冒泡排序

时间:2014-11-25 06:55:06

标签: c++ sorting

我认为我对泡泡排序有点困惑。但我的主要问题是将命令行参数转换为典型数组而不是argv。

我想通过循环遍历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;
}

2 个答案:

答案 0 :(得分:1)

首先,你正在混合数组和向量。我会查看this页面,了解如何声明,初始化和使用向量。您正在std::vector中创建main,但将std::string[]传递给bubbleSort。这些不是同一类型。如果您想使用std::string[],则需要在main中声明此类数组,而不是使用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中进行任何交换,那么这些更改将不会反映在main中。学习通过引用传递是留给读者的练习,但你的bubbleSort函数签名看起来像void bubbleSort(std::vector<std::string> &v)。请注意,如果您已经开始使用std功能,那么使用您自己的排序算法(仅仅是学习除外)并不值得,因为已经{{ 3}}

另一种方法是使用常规的旧数组,使用自己的排序算法,main将是这样的:

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)

答案 1 :(得分: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