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

71,026

Solution 1

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

Solution 2

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"));

Solution 3

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.

Solution 4

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.

Solution 5

You could use a std::set, which is naturally a sorted container.

Share:
71,026
samoz
Author by

samoz

I am a cryptographer, working in the West Lafayete, IN area. My interests include reverse engineering, information security, ellipic curves, trusted computing environments, operating systems, and embedded systems. Most of my reversing is on Windows, but I like to practice my make-fu and Unix-fu on Arch Linux.

Updated on March 17, 2020

Comments

  • samoz
    samoz about 4 years

    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);
    }