如何在c ++中对命令行参数进行排序

时间:2014-08-16 20:50:58

标签: c++ sorting vector iterator arguments

我现在想做的就是排序命令行参数,但我一直遇到一个分段错误(核心转储)错误,我认为这意味着我有一个指向虚构位置的指针。

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

using namespace std;

int main (int argc, char* argv[]) {

  vector<int> the_args;
  vector<int>::iterator it;
  it = the_args.begin(); //this seems logical to me.
  int i = 1; //so I'll skip over argv[0]

  while (i < argc) 
  {
    the_args.insert (it, atoi(argv[i]));
    i++;
    it++;//this is probably the perpetrator.
  }

  sort (the_args.begin(), the_args.end());

  for (it = the_args.begin(); it < the_args.end(); it++) //or else it's this
  {
    cout << *it << " ";
  }


  return 0;
}

我最终想要编制游戏。我已经获得了足够的Java经验,我认为我可以开始尝试用C ++搞定并弄明白......但也许不是吗?请你好好回答,我真的很沮丧,我甚至不得不在这里问一些关于排序的问题。

3 个答案:

答案 0 :(得分:4)

下面:

vector<string> the_args( argv + 1, argv + argc );

或者:

vector<int> the_args;
for( int i = 1; i < argc; ++i ) 
{
    the_args.push_back( atoi( argv[i] ) );
}

然后在你正在做的时候用std::sort对其进行排序。

答案 1 :(得分:3)

the_args.insert (it, atoi(argv[i]));

这会使it无效。废弃迭代器,然后使用push_back

the_args.push_back(atoi(argv[i]));

或者,insert将一个有效的迭代器返回到刚刚插入的对象,所以你也可以这样做:

it = the_args.insert (it, atoi(argv[i]));

但是,如果你只是插入向量的末尾,那就不必要了。如果你是一个单行的粉丝,这里有一个替代你整个循环的选项:

std::transform(argv + 1, argv + argc, std::back_inserter(the_args), std::atoi);

答案 2 :(得分:1)

尝试以下

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


int main (int argc, char* argv[]) 
{
  vector<int> the_args
  if ( argc > 1 ) the_args.reserve( argc - 1 );

  for ( int i = 1; i < argc; i++ ) the_args.push_back( std::atoi( argv[i] ) );

  std::sort( the_args.begin(), the_args.end() );

  for ( int x : the_args )
  {
    std::cout << x << " ";
  }
  std::cout << std::endl;

  return 0;
}