如何构建一个std :: vector <std :: string>然后对它们进行排序?

sam*_*moz 33 c++ sorting string vector

我有一堆字符串需要排序.我认为std :: vector将是最简单的方法.但是,我之前从未使用过矢量,所以想要一些帮助.

我只需要按字母顺序对它们进行排序,没什么特别的.实际上,string :: compare函数可以工作.

之后,我如何迭代它们来验证它们是否已经排序?

这是我到目前为止所拥有的:

std::sort(data.begin(), data.end(), std::string::compare);

for(std::vector<std::string>::iterator i = data.begin(); i != data.end(); ++i)
{
    printf("%s\n", i.c_str);
}
Run Code Online (Sandbox Code Playgroud)

Joh*_*itb 66

你可以这样做

std::sort(data.begin(), data.end());
Run Code Online (Sandbox Code Playgroud)

它会排序你的字符串.然后通过它们检查它们是否有序

if(names.empty())
    return true; // empty vector sorted correctly
for(std::vector<std::string>::iterator i=names.begin(), j=i+1; 
        j != names.end(); 
        ++i, ++j)
    if(*i > *j)
        return false;
return true; // sort verified
Run Code Online (Sandbox Code Playgroud)

特别是,std::string::compare不能用作比较器,因为它不能做sort它想做的事情:如果第一个参数小于第二个参数,则返回true,否则返回false.如果您使用sort上面的内容,它将只使用operator<,这将完全相同(即使std::string它返回first.compare(second) < 0).

  • 只是为了好玩(和未经测试):检查向量是否已排序可以简化为std :: adjacent_find(names.begin(),names.end(),std :: greater <std :: string>())== names.end() (7认同)

ypn*_*nos 5

问题到底是什么?似乎一切都已经在那里了。

但是,您可能应该使用std::cout << *i << std::endl;

  1. i是一个迭代器==指向容器中数据的指针,所以*需要
  2. c_str()是函数std::string而不是变量

您的代码中的问题与您的问题无关?

给你一些提示:

  • std::vector还覆盖[]运算符,因此您可以节省迭代器的麻烦并将其像数组一样使用(从0to迭代vector.size())。
  • 您可以使用std::set它,它在插入时自动排序(二叉树),因此您可以节省额外的排序。
  • 使用函子可以让你的输出变得更加有趣:copy(V.begin(), V.end(), ostream_iterator<std::string>(cout, "\n"));