返回const_iterator时出错

时间:2014-04-27 20:14:16

标签: c++ visual-c++ c++11

当我尝试使用常量迭代器时,我收到错误。我希望能够在findntoLast迭代器中返回迭代器,而不是通过从新引用迭代到链表的末尾来显示链表的值。

//Main.cpp
#include <iostream>
using std::cout;
using std::cin;
using std::endl;
#include <list>
#include <cstdlib>
#include <forward_list>

using std::forward_list;
typedef std::forward_list<int>::const_iterator constListIt;

#include "LinkedListQ2.h"

int main()
{
    forward_list<int> myList;
    for ( size_t i = 0; i < 20; i++)
    myList.push_front(i);
    constListIt myListIt = myList.begin();
    for( myListIt; myListIt !=  myList.end(); myListIt++)
    cout << *myListIt << endl;
    constListIt newListIt = findntoLast(myList, 5);

    while(newListIt != myList.end())
    {
        cout << *newListIt << endl;
    newListIt++;
    }
    return 0;
}

/* LinkedListQ1.h*/
#ifndef LINKED_LIST_Q1_H_
#define LINKED_LIST_Q1_H_
#include <iterator>
using std::next;
#include <cstdlib>
#include <forward_list>
using std::forward_list;

template<typename T>
typename std::forward_list<T>::const_iterator findntoLast( forward_list<T> sList,  size_t count )
{
     typedef std::forward_list<T>::const_iterator sListIterator;
         sListIterator newList = sList.begin();

    for(size_t increment = 0; increment < count -1; increment++)
    {
        newList++;
    }

    return newList;
}
#endif

1 个答案:

答案 0 :(得分:3)

template<typename T>
typename [...]::const_iterator findntoLast( forward_list<T> sList, [...])

该参数按值传递。这意味着您的findntoLast适用于原始列表的副本。函数返回时,该副本将被销毁。因此,引用它的任何迭代器都将变为无效。

通过const引用获取列表,该问题应该消失。

您还错过了typedef中的typename

typedef typename std::forward_list<T>::const_iterator sListIterator;

最后,看看std::advance,它可以满足您的需求(如果您更改了基础集合类型,它将利用随机访问迭代器)。