2010-02-19 2 views
0

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

Во всяком случае вот код:

#include <iostream> 
#include <string> 
#include <vector> 

using namespace std; 


vector<string> print_triangle(int max_stars) 
{ 
vector<string> buffer; 

if(max_stars == 1) 
{ 
    buffer.push_back("*"); 
    buffer.push_back("*"); 
    return buffer; 
} 

//This is the first part of the program that writes the first line of 
//asterisks 
string tmp; 
for(int i = 0; i < max_stars; i++) 
{ 
    tmp.push_back('*'); 
} 

buffer.push_back(tmp); 

//This is the recursive part of the program, which generates the 
//remainder of the triangle pattern - the inner part. 
vector<string> inner_part; 
inner_part = print_triangle(max_stars - 1); 

vector<string>::iterator iter = inner_part.begin(); 
      for(; iter != inner_part.end(); ++iter) 
      { 
       buffer.push_back(*iter); 
      } 
string tmp1; 
for(int i = 0; i < max_stars; i++) 
{ 
    tmp1.push_back('*'); 
} 
buffer.push_back(tmp1); 

return buffer; 
} 

Этот код не работает, однако, если вы замените итератор в следующем разделе кода он работает нормально.

for(int i = 0; i < inner_part.size(); ++i) 
{ 
    buffer.push_back(inner_part[i]); 
} 

Мой вопрос в том, почему итераторы не работают в этом контексте.

+2

Возможно, вы получите ответы быстрее, если вы дадите более подробную информацию, чем «этот код не работает». Когда: время компиляции? во время выполнения? Что происходит? –

+0

Совершенно сложное решение для очень простой задачи ... – user231967

+1

BTW: 'std :: string (max_stars, '*')' будет строить строку так, как вы этого хотите. Вы можете сохранить его в переменной 'stars', а затем нажать его на' buffer' до и после рекурсии, так что вам не придется строить его дважды. –

ответ

0

Я знаю, что это. Я должен использовать iter ++ в исходном коде. Он работает в обоих компиляторах. Это ошибка, которую я сделал раньше.

+2

Он должен работать с '++ iter' или' iter ++ '. Если это имеет значение, то где-то происходит что-то смешное. –

+0

Позвольте мне попробовать его в моем исходном компиляторе и подтвердить, что по-прежнему получаю ту же ошибку. – hairyyak

+0

Нет, сейчас он работает - независимо от того, что я делаю. Я совершенно смущен. – hairyyak

0

Может попробуете

#include <string> 
#include <vector> 

using namespace std; 

vector<string> print_triangle(int max_stars) 
{ 
vector<string> buffer; 
if (max_stars < 1) 
    return buffer; 

buffer.reserve(max_stars + 2); 

while (max_stars > 1) 
{ 
    buffer.push_back(string(max_stars, '*')); 
    max_stars--; 
} 
buffer.push_back("*"); 
buffer.push_back("*"); 

return buffer; 
} 

Нет рекурсию, меньшее потребление памяти, быстрее. И не упадет в бесконечный цикл, если max_stars < 1. И нет итераторов :-)

+0

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

+0

Но спасибо за написание альтернативного метода. – hairyyak

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