我认为我对泡泡排序有点困惑。但我的主要问题是将命令行参数转换为典型数组而不是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;
}
答案 0 :(得分:1)
首先,你正在混合数组和向量。我会查看this页面,了解如何声明,初始化和使用向量。您正在std::vector
中创建main
,但将std::string[]
传递给bubbleSort
。这些不是同一类型。如果您想使用std::string[]
,则需要在main中声明此类数组,而不是使用std::vector
和std::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);那么请参考以下链接
http://www.boost.org/doc/libs/1_41_0/doc/html/program_options.html