我有一堆字符串需要排序。我认为 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());
它会对你的字符串进行排序。然后检查它们是否正常
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
)。
问题到底是什么?似乎一切都已经在那里了。
但是,您可能应该使用
std::cout << *i << std::endl;
i
是一个迭代器==指向容器中数据的指针,所以需要*
c_str()
是 std::string
的函数,而不是变量您代码中的问题与您的问题无关?
给你一些提示:
std::vector
还覆盖 []
运算符,因此您可以省去迭代器的麻烦,并将其像数组一样使用(从 0
迭代到 vector.size()
)。std::set
来代替,它在插入时自动排序(二叉树),因此您可以节省额外的排序。copy(V.begin(), V.end(), ostream_iterator<std::string>(cout, "\n"));
litb一如既往地正确。
我只是想指出更普遍的一点 - 任何可以与 进行比较的东西< can be sorted with std::sort. I'll sometimes sneak an operator< member function into a struct, just so I can do this.
用于排序使用:
std::sort
或 std::vector< std::string>::sort(..)
方法。std::is_sorted
检查是否已排序 - http://www.sgi.com/tech/stl/is_sorted.htmlstd::adjacent_find( v.begin(), v.end(), std::greater< std::string >() ) == v.end()
对于您的情况,您可以使用默认比较器
编辑:
std::is_sorted
不是标准的stl函数,它在sgi stl实现中定义。对字符串进行排序:
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;
}
您可以使用
std::set
,它自然是一个排序的容器。
尝试使用比较器:
// 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(), mFfunction);
for (int i = 0; i < n; i++)
cout << arr[i] << endl;
return 0;
}