I have a bunch of strings that I need to sort. I think a std::vector would be the easiest way to do this. However, I\'ve never used vectors before and so would like some help.
You can just do
std::sort(data.begin(), data.end());
And it will sort your strings. Then go through them checking whether they are in order
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
In particular, std::string::compare
couldn't be used as a comparator, because it doesn't do what sort
wants it to do: Return true if the first argument is less than the second, and return false otherwise. If you use sort
like above, it will just use operator<
, which will do exactly that (i.e std::string
makes it return first.compare(second) < 0
).
Try using 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;
}
What is the question exactly? It seems everything is already there.
However, you should probably use std::cout << *i << std::endl;
i
is an iterator == pointer to the data in the container, so *
is neededc_str()
is a function of std::string
and not a variableThe problems in your code do not relate to your question?
Some hints for you:
std::vector
also overrides []
operator, so you can instead save the iterator hassle and use it like an array (iterate from 0
to vector.size()
).std::set
instead, which has automatically sorting on insertion (binary tree), so you save the extra sorting.copy(V.begin(), V.end(), ostream_iterator<std::string>(cout, "\n"));
For sort use:
std::sort
or std::vector< std::string>::sort(..)
method.
To check if it is sorted:
use std::is_sorted
for check is sorted - http://www.sgi.com/tech/stl/is_sorted.html
or
std::adjacent_find( v.begin(), v.end(), std::greater< std::string >() ) == v.end()
for your case you could use default comparator
EDITED:
std::is_sorted
is not standard stl function, it defined in sgi stl implementation.
Thanks @Brian Neal for this note.
You could use a std::set
, which is naturally a sorted container.
litb is correct, as always.
I just wanted to point out the more general point - anything that can be compared with < can be sorted with std::sort. I'll sometimes sneak an operator< member function into a struct, just so I can do this.