Подтвердить что ты не робот

Как я могу построить std::vector <std::string>, а затем отсортировать их?

У меня есть набор строк, которые мне нужно сортировать. Я думаю, что 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);
}
4b9b3361

Ответ 1

Вы можете просто сделать

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<, который будет делать именно это (i.e std::string заставляет его возвращать first.compare(second) < 0).

Ответ 2

В чем именно вопрос? Кажется, все уже там.

Однако вы, вероятно, должны использовать 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"));

Ответ 3

Для сортировки:
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 за эту заметку.

Ответ 4

litb является правильным, как всегда.

Я просто хотел указать более общую точку - , которую можно сравнить с < могут быть отсортированы с помощью std:: sort. Я иногда подкрадываюсь к оператору < член-функции в структуру, так что я могу это сделать.

Ответ 5

Вы можете использовать std::set, который является, естественно, сортированным контейнером.

Ответ 6

Сортировка строки:

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

С++ 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;
}