2016-07-15 4 views
1

Я пытаюсь напечатать std::string назад с итераторы, как это:C++ Как напечатать строку назад?

std::string back = "hello"; 
for(std::string::iterator it=back.end(); it!=back.begin(); --it) 
{ 
    std::cout << (*it); 
} 

Но выход будет печатать только:

olle 

Почему также не распечатав час? Я попробовал пару разных вещей и поиграл с ним, но я просто не могу понять, почему. Любая помощь будет принята с благодарностью, спасибо! :)

+2

Проблема заключается в том что 'back.end()' указывает * позади * строку, а не на последний элемент. Вы пробовали http://en.cppreference.com/w/cpp/iterator/reverse_iterator? – pingul

+1

Почему бы не использовать 'std :: reverse()'? –

+0

'it> = back.begin()' – GreatAndPowerfulOz

ответ

13
std::string back = "hello"; 
for (std::string::reverse_iterator it = back.rbegin(); it != back.rend(); ++it) 
{ 
    std::cout << (*it); 
} 
+0

Теперь я буду использовать обратные итераторы, которые, как я знаю, они существуют. Благодаря! :) – ocean800

6
std::string::iterator it=back.end(); 

it инициализируется в end(). Затем, внутри цикла:

std::cout << (*it); 

Поскольку начальное значение it является end(), разыменовании это неопределенное поведение, с непредсказуемыми результатами.

Правильный подход к уменьшаем itперед тем он получает разыменовываются:

for(std::string::iterator it=back.end(); it!=back.begin();) 
{ 
    --it; 
    std::cout << (*it); 
} 
+0

Ударьте меня на него. Тем не менее, я также собирался предложить обратные итераторы. –

+0

Ahhhh Я вижу. Спасибо за объяснение, где я пошла не так. Я верю, что буду использовать обратные итераторы для этого, хотя теперь, когда я знаю, что они существуют :) – ocean800

5

Если вы не хотите для цикла:

#include <algorithm> 

std::string string_back = "hello"; 
std::reverse(string_back.begin(), string_back.end()); 
std::cout << string_back; // prints 'olleh' 
+0

В моем случае я специально хочу итератор, потому что я делаю некоторые преобразования на каждом 'char', но я буду помнить об этом :) – ocean800

+0

А, я понимаю. Подумайте о моих ответах для вас в будущих случаях. – peterkshultz