внешний итератор для класса String

Рубрика: C++, Дата: 23 March, 2013, Автор:
Tags:

Для класса String http://www.kselax.ru/2013/03/klass-string/ определите внешний итератор:

class Sring_iter //ссылкается на строку и елемент строки
{
public:
	String_iter(String& s);//итератор для s
	char& next();//ссылка на следующий элемент
	//иные операции по вашему выбору
};

Сравните это по удобству, стилю программирования и эффективности с внутренним итератором для String (в смысле понятия текущего элемента String и операций над этим элементом)

Сам класс String находится по ссылке выше. Итак мы создали класс String_iter

вот его код файл String_iter.h:

//ob69vlenie
#ifndef STRING_ITER_H
#define STRING_ITER_H

class String_iter //ссылкается на строку и елемент строки
{
	String *str;//ykazatel6 na String
	int i;
public:
	String_iter(String& s)//итератор для s
	:str(&s), i(0){}
	
	char next()//ссылка на следующий элемент
	{
		char a=(*str)[i];//вызов перегруженой операции преобразования
		//cout <<a<<endl;
		return a;
	}
	
	//устанавливает итератор в начало
	void begin()
	{
		i=0;
	}
	
	//проверяет в конце ли итератор
	bool end()
	{
		if(i==str->rep->sz)
			return false;
			
		return true;
	}
	
	//peregryzka inkrementa
	void operator++()
	{
		i++;
	}
	
	//иные операции по вашему выбору
};

#endif

файла String_iter.cpp нету у нас все поместилось в String_iter.h.

Теперь файл самой программы br.cpp

//cozdaite dl9 klacca String vnewnii iterator;
#include <iostream>
using std::cout;
using std::endl;
#include <cstdlib>
using std::exit;

#include "String.cpp"
#include "String_iter.h"

int main()
{
	String s("Hellow");
	cout <<s[1]<<endl;
	String_iter i(s);
	
	for(i.begin();i.end();++i)
	{
		cout <<i.next();
		//exit(1);
	}
	cout <<endl;
	
	return 0;
}

Мы в классе String_iter обращаемся к закрытым членам класса String. Просто так обращаться к закрытым членам класса нельзя, поэтому мы делаем класс String_iter другом класса String добавив в класс String строку

friend class String_iter;

и все мы спокойно работаем с закрытыми членами класса String в классе String_iter.

Что еще добавить? Да больше пожалуй нечего. Не такая и сложная оказалась задачка.

  • Александр

    В условии:
    char& next();
    что обязывает к исполнению возможно такого кода:
    //String_iter i(s);
    i.next()++;

    • Зачем тебе ++, тут просто функцию используешь next и все.

  • Александр

    “++” говорит о том, что слева должно быть lvalue, а не то, что “проще реализовать”. Функция next() должна вернуть ссылку на элемент (существующий элемент), а не копию этого элемента.
    Реализация задуманного Страуструпом значительно “веселее”.

    • да не нужно “++” использовать, как хочешь так и реализовывай “++” можно заменить любой функцией “++” это тот же самый вызов функции. Я уже не помню что там нужно было сделать. Та и вообще забей лучше на Страуструпа и учи лучше с# или что то получше. Страуструпа нужно читать тем кто будет библиотеки классов на С++ разрабатывать, другим оно не нужно, так как Страуструп описывает Страуструп обычным прикладным программистам знать не нужно. Учил и толку, зря потеряное время, все равно С# лучше любого С++ )))

      Щас вордпресс учу, перспективней для фриланса ИМХО. Сайт мб. этот улучшу, под стековерфлоу сделаю мб. если разберусь.

rss