Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How can I build a std::vector<std::string> and then sort them?

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.

I just need to sort them alphanumerically, nothing special. Indeed, the string::compare function would work.

After that, how can I iterate through them to verify that they're sorted?

Here's what I have so far:

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); } 
like image 280
samoz Avatar asked Mar 27 '09 00:03

samoz


2 Answers

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).

like image 184
Johannes Schaub - litb Avatar answered Sep 22 '22 16:09

Johannes Schaub - litb


What is the question exactly? It seems everything is already there.

However, you should probably use std::cout << *i << std::endl;

  1. i is an iterator == pointer to the data in the container, so * is needed
  2. c_str() is a function of std::string and not a variable

The 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()).
  • You could use std::set instead, which has automatically sorting on insertion (binary tree), so you save the extra sorting.
  • Using a functor makes your output even more fun: copy(V.begin(), V.end(), ostream_iterator<std::string>(cout, "\n"));
like image 23
ypnos Avatar answered Sep 20 '22 16:09

ypnos