【发布时间】:2021-12-30 15:08:19
【问题描述】:
请帮忙。
我必须将一些旧的 C++ 代码转换为 C#,并且在迭代器转换时遇到问题。 这是 C++ 代码:
// list<int> myList
for(list<int>::iterator iter = myList.begin(); iter != myList.end() and not end;)
{
int element = *it;
//
... do something
//
iter++;
if(not end)
{
myList.push_back(element);
myList.pop_front();
}
}
我尝试将其直接 1:1 转换为 C# ...
// List<int> myList;
foreach (int element in myList)
{
//
... do something
//
if (!end)
{
myList.Add(element);
myList.RemoveAt(0);
}
}
...但是我得到了一个 InvalidOperationException,抱怨迭代器无法工作,因为列表是用Add/RemoveAt...修改的...
所以我的第二次尝试是不使用迭代器:
// List<int> myList;
for (int iter = 0; iter < myList.Count && !end;)
{
int element = myList[it];
//
... do something
//
iter++;
if (!end)
{
myList.Add(element);
myList.RemoveAt(0);
}
}
但现在我不确定 C# 代码的行为是否与 C++ 代码完全相同?
当使用push_back 和pop_front 时,C++ 中的迭代器会发生什么?它会保持在同一个元素上吗?
还是我需要修改 C# 代码并在 Add/RemoveAt 旁边执行另一个 iter++?
【问题讨论】:
-
据我所知,C++
std::list和 C#list是完全不同的结构。所以不要期望行为相似。 -
我没想到。这就是我问的原因 :) 但在这种情况下,唯一有趣的是:当使用
push_back和pop_front时,C++ 中的迭代器会发生什么?当我知道这一点后,我会在 C# 中相应地管理它。 -
由于
iter是 C# 代码中的索引,并且您删除了列表的第一个元素,您应该在RemoveAt调用之后有一个--iter以保持它引用相同元素。 -
好点! C++代码中的迭代器在使用
pop_front后是否也引用了同一个元素? -
如果您想要从 C++ 到 C# 的一对一转换,您应该使用
LinkedList<int>而不是List<int>。LinkedList与 C++std::list的数据结构差不多