C ++:我在一种方法中获得了一个迭代器,如何在另一种方法中通过迭代器修改原始列表?

Posted

技术标签:

【中文标题】C ++:我在一种方法中获得了一个迭代器,如何在另一种方法中通过迭代器修改原始列表?【英文标题】:C++: I get an iterator in one method, how to modify the original list by iterator in another mothod? 【发布时间】:2020-07-16 08:42:59 【问题描述】:

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

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;
    

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

提前致谢

【问题讨论】:

您的get_iterator 函数与std::find 基本相同。所以你可以改用它。 代码被简化了。如果类型不是int而是struct,比如struct a int id; char name[20];,而我只知道id怎么办?我不知道如何通过 std::find 来做到这一点。 然后你可以使用std::find_if 并传递一个 lambda 函数作为第三个参数。 lambda 函数将比较 id。例如。 std::find_if(lis.begin(), lis.end(), [=](const struct a&amp; x) return x.id == id; ); 其中lis 是列表,id 是包含您要搜索的 id 的变量。 太棒了,我从这篇文章中学到了很多东西!谢谢 john、mch 和 Phantomas。 【参考方案1】:

list&lt;int&gt;::iterator get_iterator(list&lt;int&gt; li,int value)按值获取列表,所以是原始列表的副本。

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

你想通过引用传递列表

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

【讨论】:

【参考方案2】:

你的想法其实是对的。但是您的问题来自函数get_iterator。在您当前的实现中,您按值获取参数li,它在内部创建一个副本。因此,您获得的迭代器属于函数 main 中列表的副本,而不是来自该列表。

您可以通过将参数 li 的类型从 list&lt;int&gt; li 替换为 list&lt;int&gt; &amp;li 来通过引用获取列表来解决您的问题。

【讨论】:

【参考方案3】:

您可以将其设为全局变量,也可以通过引用将其传递给函数(在变量名前加上 &)

【讨论】:

以上是关于C ++:我在一种方法中获得了一个迭代器,如何在另一种方法中通过迭代器修改原始列表?的主要内容,如果未能解决你的问题,请参考以下文章

在多重映射中,当两个迭代器保存具有映射到不同 Value 的相同键的值时。我们如何才能在地图中找到它们中的哪一个在另一个之前

如何从位置管理器只复制一次用户位置?

如何围绕 C++ 代码编写 C 包装器以公开类方法

如何在 Python 中 .write() 两个项目,一个零和一个迭代器?

如何使用dto和C#窗口形式将信息从一种形式传输到另一种形式?

迭代时如何知道我在树的末尾?