首页 > 解决方案 > C++:我在一种方法中得到一个迭代器,如何在另一种方法中通过迭代器修改原始列表?

问题描述

我有一个列表,我想在一种方法中按值查找列表项,在另一种方法中修改此项目。这是简化的代码:

using namespace std;

//find iterator by value
list<int>::iterator get_iterator(list<int> li,int value) {
    list<int>::iterator it;
    for(it = li.begin();it != li.end();it++) {
        if(*it == value) {
            return it;
        }
    }
    return li.end();
}

int main() {
    list<int> num_list;
    for(int i = 0;i < 20;i++) {
        num_list.push_back(i);
    }
    // print the list
    for(list<int>::iterator it = num_list.begin();it != num_list.end();it++) {
        cout << *it << endl;
    }
    list<int>::iterator target_it = get_iterator(num_list,10);
    // cout << *target_it <<endl;
    *target_it = 100; // try to modify the original list(num_list) by iterator.

    // print the list again
    for(list<int>::iterator it = num_list.begin();it != num_list.end();it++) {
        cout << *it << endl;
    }
}

原名单没有修改,有机会制作吗?

提前致谢

标签: c++stliterator

解决方案


list<int>::iterator get_iterator(list<int> li,int value)按值获取列表,因此它是原始列表的副本。

返回迭代器后,副本列表被破坏,因此迭代器无效。使用它会调用未定义的行为。

您想通过引用传递列表

list<int>::iterator get_iterator(list<int> &li,int value)
                                        //^^

推荐阅读