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

时间:2009-03-27 00:19:25

标签: c++ string sorting 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);
}

7 个答案:

答案 0 :(得分:65)

你可以做到

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

它会对你的字符串进行排序。然后通过它们检查它们是否按顺序

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

特别是,std::string::compare不能用作比较器,因为它不执行sort希望它做的事情:如果第一个参数小于第二个参数,则返回true,并且否则返回false。如果你使用上面的sort,那么它只会使用operator<,这样做会完全相同(即std::string让它返回first.compare(second) < 0)。

答案 1 :(得分:3)

究竟是什么问题?似乎一切都已存在。

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

  1. i是一个iterator ==指向容器中数据的指针,因此需要*
  2. c_str()std::string的函数,而不是变量
  3. 您的代码中的问题与您的问题无关?

    为您提供一些提示:

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

答案 2 :(得分:2)

排序用途:
std::sortstd::vector< std::string>::sort(..)方法 检查是否已排序:
使用std::is_sorted进行检查已排序 - http://www.sgi.com/tech/stl/is_sorted.html

std::adjacent_find( v.begin(), v.end(), std::greater< std::string >() ) == v.end()

对于您的情况,您可以使用默认比较器

<强>编辑:
std::is_sorted不是标准的stl函数,它在sgi stl实现中定义 感谢@Brian Neal的这个说明。

答案 3 :(得分:2)

litb一如既往是正确的。

我只是想指出可以与&lt;&lt;比较的更通用的点 - 任何。可以使用std :: sort进行排序。我有时会偷偷摸摸一个操作员&lt;将成员函数转换为结构,这样我就可以做到这一点。

答案 4 :(得分:0)

您可以使用std::set,它自然是一个已排序的容器。

答案 5 :(得分:0)

对字符串进行排序:

using namespace std; // to avoid using std everywhere 
std::sort(data.begin(), data.end()); // this will sort the strings

检查矢量是否已排序:

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

C ++ 11检查已排序向量的方法: std::is_sorted(vec.begin(),vec.end())

现在打印已排序的矢量:

   for(std::vector< std::string>::iterator i = vec.begin(); i != vec.end(); ++i)
{
    std::cout<< *i <<std::endl;
}

答案 6 :(得分:0)

尝试使用comaprator:

 #include <cmath>
 #include <cstdio>
 #include <vector>
 #include <iostream>
 #include <algorithm>
 using namespace std;

//comparing function only sorts if string size is equal and keeps the larger integgers at last.
bool myfunction (string i,string j) 
{ 
int n=i.length();
int m=j.length();
if(n==m)
    return (i<j);

return n<m;   
  }


int main() {
int n;
cin>>n;
vector <string> arr(n);
for(int i=0;i<n;i++)
    cin>>arr[i];


sort(arr.begin(),arr.end(),myfunction);

for(int i=0;i<n;i++)
    cout<<arr[i]<<endl;

return 0;
 }