C++ 如何构建std::vector<;标准::字符串>;然后把它们分类?

C++ 如何构建std::vector<;标准::字符串>;然后把它们分类?,c++,string,sorting,vector,C++,String,Sorting,Vector,我有一堆字符串需要排序。我认为std::vector是最简单的方法。但是,我以前从未使用过向量,因此希望得到一些帮助 我只需要按字母数字排序,没什么特别的。实际上,string::compare函数可以工作 在那之后,我如何遍历它们以验证它们是否已排序 以下是我目前掌握的情况: std::sort(data.begin(), data.end(), std::string::compare); for(std::vector<std::string>::iterator i = d

我有一堆字符串需要排序。我认为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);
}
std::sort(data.begin()、data.end()、std::string::compare);
对于(std::vector::iterator i=data.begin();i!=data.end();++i)
{
printf(“%s\n”,i.c\u str);
}

问题到底是什么?似乎一切都已经准备好了

但是,您可能应该使用
std::cout,您可以这样做

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
if(names.empty())
返回true;//空向量排序正确
对于(std::vector::iterator i=names.begin(),j=i+1;
j!=names.end();
++i、 ++j)
如果(*i>*j)
返回false;
返回true;//排序验证

特别是,
std::string::compare
不能用作比较器,因为它不做
sort
希望它做的事情:如果第一个参数小于第二个参数,则返回true,否则返回false。如果您像上面那样使用
排序
,它将只使用
操作符进行排序使用:
std::sort
std::vector::sort(..)
方法。
检查是否已排序:
使用
std::is_sorted
检查是否已排序-

std::nexting_find(v.begin()、v.end()、std::greater())==v.end()

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

编辑:
std::is_sorted
不是标准的stl函数,它在sgi stl实现中定义。
感谢@Brian Neal的留言。

一如既往地正确


我只想指出更一般的一点——任何可以与<相比较的东西都可以用std::sort进行排序。有时,我会将运算符您可以使用
std::set
,它自然是一个已排序的容器。

对字符串排序:

检查向量是否已排序:

尝试使用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;
 }
#包括
#包括
#包括
#包括
#包括
使用名称空间std;
//比较函数仅在字符串大小相等时进行排序,并最终保留较大的整数。
bool myfunction(字符串i、字符串j)
{ 
int n=i.长度();
int m=j.长度();
如果(n==m)
返回(in;
向量arr(n);
对于(int i=0;i>arr[i];
排序(arr.begin()、arr.end()、myfunction);

对于(int i=0;iYou不应该依赖于sgi站点获取STL的信息。它早于标准。is_sorted不是标准的。如果我错了,请纠正我:is_sorted是在c++11中添加的,只是为了好玩(且未经测试):检查向量是否已排序可以简化为std::nextant_find(names.begin(),names.end(),std::greater())==names.end()请看下面的答案:[boost::sort][1][1]:我已经检查了代码块和ideone,效果很好。从C++11开始,检查向量是否排序只是
std::is_sorted(vec.begin(),vec.end())
您不应该依赖sgi站点获取STL信息。它早于标准。is_sorted is not standardis_sorted is not standardAFAIK,is_sorted是在C++11中添加的
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
   for(std::vector< std::string>::iterator i = vec.begin(); i != vec.end(); ++i)
{
    std::cout<< *i <<std::endl;
}
 #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;
 }