int указатель на .end () списка - PullRequest
       16

int указатель на .end () списка

2 голосов
/ 18 февраля 2012

В настоящее время я работаю над созданием файла заголовка, который действует как стандартная библиотека. Я нахожусь в процессе реализации .end () для моего связанного списка. В моем файле cpp у меня есть целочисленный указатель, который, как ожидается, получит значение .end () как

int* itrend;
itrend = ca.end();

ca это просто экземпляр моего объекта в моем заголовочном файле. В моем файле hpp у меня есть итератор списка, идущий к моему listofvalues.end(). Я хотел бы вернуть значение .end() как

int* end() 
{
    std::list<value_type>::iterator i = listOfValues.end();
    return (&*i);

}

Мой «Список значений» - это просто список, содержащий несколько целых чисел. например,

[1,2,3,4,5,6,7,8,9]

В моем файле hpp у меня есть итератор списка, идущий к моему listofvalues.end(). Я хотел бы вернуть значение .end() (которое возвращает итератор списка); Теперь возникает проблема, связанная с возвращением итератора списка, когда я хочу получить целочисленный указатель. Я попытался почтить его и получить адрес с помощью &*, и это даст сообщение об ошибке «List Iterator Not Dereferencable». Я знаю, это потому, что я пытаюсь получить элемент после последнего значения, но это именно то, что мне нужно вернуть, так как я пытаюсь повторно реализовать метод связанного списка .end().

Кто-нибудь знает, как я могу указать целочисленный указатель на List.end()?

Любая помощь приветствуется.

Ответы [ 4 ]

4 голосов
/ 18 февраля 2012

Для реализации begin() и end() в стиле, аналогичном возвращению STL iterator с, а не указатели:

template <typename value_type>
class my_list
{
public:
    typedef std::list<value_type>::iterator iterator;
    typedef std::list<value_type>::const_iterator const_iterator;

    iterator begin() { return listofValues.begin(); }
    const_iterator begin() const { return listofValues.begin(); }


    iterator end() { return listofValues.end(); }
    const_iterator end() const { return listofValues.end(); }
};
2 голосов
/ 18 февраля 2012

как вы в любом случае используете свое собственное значение end ()?почему бы не вернуть ноль, когда итератор должен вернуть end ()?

int* end() 
{
    return NULL;
}
2 голосов
/ 18 февраля 2012

Вы не можете.Вот почему контейнеры стандартной библиотеки более общие , чем плоский массив.В массиве в стиле C вы можете сформировать указатель один за другим (хотя вы не можете разыменовать его) и использовать его в качестве сторожа.В более абстрактном контейнере такой «естественной» механики нет, поэтому итераторы были изобретены в первую очередь: они являются обобщением указателей, которые работают в более общем контексте.Каждый тип итератора контейнера должен решить проблему предоставления подходящего «конечного» дозорного значения по-своему.

0 голосов
/ 18 февраля 2012

Идея представления конца связанного списка с помощью указателя несколько ошибочна, поскольку вы не можете обработать указатель с помощью ++ в связанном списке, он ничего не повторяет.

Если вы хотите получить заднюю часть списка, реализуйте l.back() и возвращайте ссылку на последнее значение.

...