我有一堆字符串需要排序。我认为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);
}
答案 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;
i
是一个iterator ==指向容器中数据的指针,因此需要*
c_str()
是std::string
的函数,而不是变量您的代码中的问题与您的问题无关?
为您提供一些提示:
std::vector
也会覆盖[]
运算符,因此您可以保存迭代器麻烦并将其用作数组(从0
迭代到vector.size()
)。std::set
代替,它会在插入时自动排序(二叉树),因此您可以节省额外的排序。copy(V.begin(), V.end(), ostream_iterator<std::string>(cout, "\n"));
答案 2 :(得分:2)
排序用途:
std::sort
或std::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;
}