2016-09-14 5 views
0

Есть ли способ сортировки подстроки с использованием STL?Сортировка подстроки с использованием STL

Я знаю, что смогу это сделать.

std::string word="dcba"; 
std::sort(word.begin(), word.end()); 

Но как получить итераторы для произвольных индексов?

eg-Если бы я хотел, чтобы отсортировать от индексов 2 до 4, «DCAB»

Edit - Это было необходимо для функции, чтобы генерировать следующий лексикографическом последовательность из заданной строки.

bool nextLex(string s) { 
    for(int i=s.length()-1;i>=0;i--) { 
     for(int j=i-1;j>=0;j--) { 
      if(s[j]<s[i]) { 
       swap(s[i],s[j]); 
       sort(s.begin()+j,s.end()); 
       cout<<s<<endl; 
       return true; 
      } 
     } 
    } 
return false; 
} 
+1

word.begin() + 2, word.begin() + 4. Не забудьте проверить размер – Danh

+1

Вы можете посмотреть на 'std :: next_permutation' для следующей лексикографической последовательности. [Demo] (https://ideone.com/M2Z5MT) – Jarod42

ответ

2

std::string использует итераторы произвольного доступа, так что вы можете просто добавить индексы к begin итератора:

std::string word="dcba"; 
std::sort(word.begin()+2, word.begin()+4); 

В качестве альтернативы, вы можете использовать std::advance():

std::string word="dcba"; 

std::string::iterator start = word.begin(); 
std::advance(start, 2); 

std::string::iterator end = start; 
std::advance(end, 2); 

std::sort(start, end); 

Кроме того, вы может использовать std::next() (C++ 11 и более поздние версии):

std::string word="dcba"; 
std::sort(std::next(word.begin(), 2), std::next(word.begin(), 4)); 

Или:

std::string word="dcba"; 
auto start = std::next(word.begin(), 2); 
std::sort(start, std::next(start, 2)); 
+0

Спасибо! Это позволяет работать. Хотя мой код по-прежнему, похоже, не делает то, что ему нужно. Я отредактировал исходный вопрос, не могли бы вы взглянуть на него, пожалуйста? – Metafity

Смежные вопросы