通过迭代器更改对象成员?

时间:2010-12-16 23:39:55

标签: c++ iterator

因为我使用过C ++已经有一段时间了。我可以这样做吗?:

for (vector<Node>::iterator n = active.begin(); n!=active.end(); ++n) {
  n->ax /= n->m;
}

其中Node是一个有几个浮点数的对象?

如果用Java编写,我想要完成的是类似于:

for (Node n : this.active) {
  n.ax /= n.m;
}

其中active是Node对象的arrayList。

我想我忘记了一些关于通过引用传递的怪癖或者在绝望中抛出手的东西

6 个答案:

答案 0 :(得分:1)

简短回答:是的,你可以。

迭代器是容器元素的代理。在某些情况下,迭代器实际上只是指向元素的指针。

答案 1 :(得分:1)

是。此语法基本上适用于几乎所有STL容器。

// this will walk it the container from the beginning to the end.
for(container::iterator it = object.begin(); it != object.end(); it++)
{
}

object.begin() - 基本上给迭代器提供容器的第一个元素。

object.end() - 迭代器在遍历所有元素后设置为此值。请注意,为了检查结尾,我们使用了!=

operator ++ - 将迭代器移动到下一个元素。

根据容器的类型,您可以通过其他方式导航迭代器(比如说向后,随机到容器中的某个位置等)。对迭代器的一个很好的介绍是here

答案 2 :(得分:0)

您的代码适用于我

#include <vector>
using std::vector;
struct Node{
  double ax;
  double m;
};

int main()
{
  vector<Node> active;
  for (vector<Node>::iterator n = active.begin(); n!=active.end(); ++n) {
    n->ax /= n->m;
  }
}

答案 3 :(得分:0)

您可以安全地更改容器中包含的对象而不会使迭代器失效(使用关联容器,这仅适用于元素的'value'部分,而不适用于'key'部分。)

但是,您可能会想到的是,如果您更改容器(例如删除或移动元素),则现有的迭代器可能会失效,具体取决于容器,操作是执行,以及所涉及的迭代器的细节(这就是为什么你不允许更改关联容器中对象的'key'的原因 - 在一般情况下需要移动容器中的对象)。

答案 4 :(得分:0)

std::vector的情况下,是的,您可以通过取消引用迭代器来操作对象。对于已排序的容器(例如std::set),您无法执行此操作。由于集合按顺序插入元素,因此不允许直接操作内容,因为它可能会破坏排序。

答案 5 :(得分:0)

你有什么工作。您也可以使用众多STL算法中的一种来完成同样的事情。

std::for_each(active.begin(), active.end(), [](Node &n){ n.ax /= n.m; });