首页 > 解决方案 > C++ 赋值 std::list::iterator 在 main 中工作,但在方法中却没有

问题描述

你好 :) 我想知道基于 std::list 制作循环列表,我正在寻找 STL 循环列表,但我没有找到。我有想法创建增加 std::list::iterator 的函数,当迭代器 == list.end 时,它分配迭代器 = list.begin()。不幸的是没有匹配分配运算符。我决定使用堆内存。并在旧的指向列表末尾时分配新的迭代器。它在主要功能中起作用。但作为方法它不会。我完全坚持这一点,知道我应该怎么想吗?

void increment_iterator(const std::list<int> & list, std::list<int>::iterator *iterator, int &val)
{
    for(int i=0;i<val;i++)
    {
        iterator->operator++();
        if(*iterator == list.end())
        {
//            *iterator = list.begin(); //here is problem
        }
    }

}

void increment_iterator(const std::list<int> & list, std::shared_ptr<std::list<int>::iterator> it, int &val)
{
    for(int i=0;i<val;i++)
    {
        it->operator++();
        if(*it==list.end())
        {
//            *it = list.begin(); //here is problem
        }
    }
}





int main() {

    std::list<int> intlist{1,2,3,4,5,6,7};
    std::list<int>::iterator *iterator = new std::list<int>::iterator;
    *iterator=intlist.begin();
    iterator++;
    *iterator=intlist.end();
    return 0;
}

这是错误输出:

Scanning dependencies of target CodeWars
[ 33%] Building CXX object CMakeFiles/CodeWars.dir/main.cpp.o
/home/tomek/Documents/C++/zadania wlasne 1/CodeWars/main.cpp: In function ‘void increment_iterator(const std::__cxx11::list<int>&, std::__cxx11::list<int>::iterator*, int&)’:
/home/tomek/Documents/C++/zadania wlasne 1/CodeWars/main.cpp:40:36: error: no match for ‘operator=’ (operand types are ‘std::__cxx11::list<int>::iterator {aka std::_List_iterator<int>}’ and ‘std::__cxx11::list<int>::const_iterator {aka std::_List_const_iterator<int>}’)
             *iterator = list.begin();
                                    ^
In file included from /usr/include/c++/7/list:63:0,
                 from /home/tomek/Documents/C++/zadania wlasne 1/CodeWars/CodeWarsCodes.h:13,
                 from /home/tomek/Documents/C++/zadania wlasne 1/CodeWars/main.cpp:8:
/usr/include/c++/7/bits/stl_list.h:128:12: note: candidate: constexpr std::_List_iterator<int>& std::_List_iterator<int>::operator=(const std::_List_iterator<int>&)
     struct _List_iterator
            ^~~~~~~~~~~~~~
/usr/include/c++/7/bits/stl_list.h:128:12: note:   no known conversion for argument 1 from ‘std::__cxx11::list<int>::const_iterator {aka std::_List_const_iterator<int>}’ to ‘const std::_List_iterator<int>&’
/usr/include/c++/7/bits/stl_list.h:128:12: note: candidate: constexpr std::_List_iterator<int>& std::_List_iterator<int>::operator=(std::_List_iterator<int>&&)
/usr/include/c++/7/bits/stl_list.h:128:12: note:   no known conversion for argument 1 from ‘std::__cxx11::list<int>::const_iterator {aka std::_List_const_iterator<int>}’ to ‘std::_List_iterator<int>&&’

这是“正确”的解决方案

void increment_iterator( std::list<int> & list, std::list<int>::iterator *iterator, int val)
{
    for(int i=0;i<val;i++)
    {
        iterator->operator++();
        if(*iterator == list.end())
        {
            *iterator = list.begin();
        }
    }

}

感谢帮助 :)

标签: c++iterator

解决方案


有了const std::list<int> & list一个const列表,因此list.begin()调用const返回 this 的重载std::list::const_iterator就不能转换为std::list::iterator.

您需要从列表引用中删除 const 或使用const_iterator而不是iterator.


推荐阅读