Как я могу построить 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);
}
Ответы
Ответ 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;
}