2013-05-08 6 views
0

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

для этой функции, «display_backwards», предполагается отображать вход пользователя в зеркальном изображении.

У меня возникли проблемы написания кода, и это дает мне ошибки, которые я не понимаю, почему

это мой код:

void asci_art::display_backwards(vector<string> art) 
{ 
char swap[100]; 
cout << "Your Artwork in mirrored image" << endl; 
cout << "=============================" <<endl; 

for (unsigned int i=0; i < art.size(); i++) 
{ 
    for(int j=0; j < art[i].size(); j++) 
    { 

     swap[j] = art[i].end()-j; 
     art[i].begin()+j = swap[j]; 
    } 
} 

for(int k= 0; k < swap.size(); k++) 
{ 
    cout << swap[k]; 
} 
cout << endl; 

}

функция записывается в классе

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

Я получаю компиляцию ошибок, таких как «невозможно преобразовать _normal iterator> в char», который я не понимаю, потому что я имею дело с символами того же типа. "Нет такой операции как '='" ??

не понимая, почему. Может кто-нибудь объяснить? или, может быть, моя логика ошибочна, так может кто-то помочь мне переписать ее?

Голые со мной, я не так уж и хорош в C++. Я ценю помощь.

EDIT: Извините. забыл упомянуть, что я хочу, чтобы он отражал/зеркально его вертикально.

+1

Посмотрите, что означают 'begin()' и 'end()' return. – chris

+0

Вы хотите зеркалировать его по вертикали или по горизонтали? – scones

+0

@scones вертикально – user2188311

ответ

3

Используйте std::reverse, чтобы перевернуть каждую строку в vector.

void asci_art::display_backwards(vector<string> art) 
{ 
    for(auto&& a : art) { 
    std::reverse(a.begin(), a.end()); // reverses each string 
    std::cout << a << std::endl; 
    } 
} 

Или, если вы хотите изменить порядок строк в векторе, немного другой вызов реверс будет делать трюк.

void asci_art::display_backwards(vector<string> art) 
{ 
    std::reverse(art.begin(), art.end()); // reverses order of strings in vector 
    for(auto const& a : art) { 
    std::cout << a << std::endl; 
    } 
} 
+1

+1 Скажите ему прямо, что первая предназначена для вертикального зеркалирования, а вторая для горизонтального зеркалирования. : D –

+0

@Praetorian говорит, что ему нужен инициализатор перед «:» – user2188311

+0

@ user2188311 Используете ли вы компилятор, который поддерживает цикл C++ 11 для цикла? Если нет, напишите регулярное выражение для цикла 'for (vector :: iterator first = art.begin(); first! = Art.end(); ++ first) {...}' – Praetorian

0

Проблема с: искусства [я] .begin() + у = своп [J] , что вы пытаетесь сделать? присвоение 'swap [j]', который является символом целого числа?

+0

Я надеялся сохранить характер искусства [i] в ​​массив символов, обмен – user2188311

0

В вашем коде вы смешиваете использование прямого доступа к массиву и итераторов. Чтобы ваш код работал так, как вам захочется, вам нужно будет решить один из них.

Во-вторых, вы пытаетесь сохранить обратный массив. Поскольку вы не возвращаете результат этого, вам не нужно будет этого делать. Вы можете просто напрямую выводить данные в обратном порядке.

Примеры:

// using direct access 
void asci_art::display_backwards_direct(std::vector<std::string> art) { 
    std::cout << "Your Artwork in mirrored image" << std::endl; 
    std::cout << "=============================" <<std::endl; 

    for (signed int i = art.size() - 1; i >= 0; --i) { 
    std::cout << art[i]; // depending on your data you might need endl here 
    } 
    std::cout << std::endl; 
} 

// using iterators 
void asci_art::display_backwards_iterators(std::vector<std::string> art) { 
    std::cout << "Your Artwork in mirrored image" << std::endl; 
    std::cout << "=============================" <<std::endl; 

    for (std::vector<std::string>::iterator it = art.rbegin(); it != art.rend(); ++it) { 
    std::cout << *it; // depending on your data you might need endl here 
    } 
    std::cout << std::endl; 
} 

// using direct access 
void asci_art::display_backwards_direct_horizontal(std::vector<std::string> art) { 
    std::cout << "Your Artwork in mirrored image" << std::endl; 
    std::cout << "=============================" <<std::endl; 

    for (signed int i = 0; i < art.size(); ++i) { 
    std::cout << std::reverse(art[i].begin(), art[i].end()); // depending on your data you might need endl here 
    } 
    std::cout << std::endl; 
} 

// using iterators 
void asci_art::display_backwards_iterators_horizontal(std::vector<std::string> art) { 
    std::cout << "Your Artwork in mirrored image" << std::endl; 
    std::cout << "=============================" <<std::endl; 

    for (std::vector<std::string>::iterator it = art.begin(); it != art.end(); ++it) { 
    std::cout << std::reverse(it->begin(), it->end()); // depending on your data you might need endl here 
    } 
    std::cout << std::endl; 
} 

C++ 11 синтаксис будет сократить вторую версию.

Несвязанный: использование ссылок для передачи аргументов может ускорить приложение, когда вы имеете дело с действительно векторами, поэтому вектор не будет копироваться каждый раз.

void some_function(std::vector<std::string> const & const_reference_to_my_string_vector) { 
    std::cout << const_reference_to_my_string_vector.size() << std:endl; 
} 
+0

Спасибо, но он не выводил его зеркально – user2188311

+0

ну не вертикально – user2188311

+0

добавил соответствующие версии для зеркального отображения по вертикальной оси. – scones

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