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& x) return x.id == id; );
其中lis
是列表,id
是包含您要搜索的 id 的变量。
太棒了,我从这篇文章中学到了很多东西!谢谢 john、mch 和 Phantomas。
【参考方案1】:
list<int>::iterator get_iterator(list<int> li,int value)
按值获取列表,所以是原始列表的副本。
返回迭代器后,副本列表被销毁,因此迭代器无效。使用它会调用未定义的行为。
你想通过引用传递列表
list<int>::iterator get_iterator(list<int> &li,int value)
//^^
【讨论】:
【参考方案2】:你的想法其实是对的。但是您的问题来自函数get_iterator
。在您当前的实现中,您按值获取参数li
,它在内部创建一个副本。因此,您获得的迭代器属于函数 main 中列表的副本,而不是来自该列表。
您可以通过将参数 li
的类型从 list<int> li
替换为 list<int> &li
来通过引用获取列表来解决您的问题。
【讨论】:
【参考方案3】:您可以将其设为全局变量,也可以通过引用将其传递给函数(在变量名前加上 &)
【讨论】:
以上是关于C ++:我在一种方法中获得了一个迭代器,如何在另一种方法中通过迭代器修改原始列表?的主要内容,如果未能解决你的问题,请参考以下文章
在多重映射中,当两个迭代器保存具有映射到不同 Value 的相同键的值时。我们如何才能在地图中找到它们中的哪一个在另一个之前
如何在 Python 中 .write() 两个项目,一个零和一个迭代器?