[使用C ++和C#模拟量在循环内修改向量

问题描述 投票:0回答:1

我不熟悉在C ++中动态地从向量中删除项目,并且我需要将代码块转换为C#。以下代码是C ++

for(unsigned int i = 0; i < vertices.size(); i++) {
  if (vertices[i].z < 0) { // make hemisphere
      vertices.erase(vertices.begin() + i);

      // delete all triangles with vertex_i
      int t = 0;
      for (std::deque<unsigned int>::iterator it = triangles.begin();
          it != triangles.end();) {
          if (triangles[t] == i || triangles[t + 1] == i ||
              triangles[t + 2] == i) {
              it = triangles.erase(it);
              it = triangles.erase(it);
              it = triangles.erase(it);
          }
          else {
              ++it;
              ++it;
              ++it;
              t += 3;
          }
      }
      // update indices
      for (unsigned int j = 0; j < triangles.size(); j++) {
          if (triangles[j] > i) {
              triangles[j]--;
          }
      }
      i--;
  }    
// More code here...

其中

std::vector<Vector3d> vertices;
std::deque<unsigned int> triangles;

我的困惑在于从循环内部进行删除的地方。采取这条线

vertices.erase(vertices.begin() + i);

这等效于List<Vector3> RemoveAt(i)方法,但在C#中无法在循环内完成。在C#中构造此代码的最简单方法是,对逻辑和流程进行尽可能少的更改?

c# c++
1个回答
1
投票

内部循环可以简化很多,在C#中应该很容易:

注意循环中没有增量运算符吗? it将始终指向向量的开头。

因此对于内部循环,我们可以在C#中执行相同的操作:

for (int it = 0; it < triangles.Count;)
{
    if (triangles[t] == i || triangles[t+1] == i || triangles[t+2] == i)
    {
        triangles.RemoveRange(it, 3);
    }
    else
    {
        it += 3;
        t += 3;
    }
} 

注意for循环中没有增量项,这在else语句中已解决。我们可以在此处从列表中删除项目,因为.Count将始终在每次迭代时求值。我们没有修改要迭代的列表,因为没有活动的迭代器(如果使用foreach循环,则将有所不同)。

因此您可以对外部循环执行相同的操作,因为它显示vertices.erase(vertices.begin() + i);,您只需在C#中将其替换为vertices.RemoveAt(i)

© www.soinside.com 2019 - 2024. All rights reserved.