【问题标题】:What's the difference between using Iterator and for loop for a vector对向量使用迭代器和 for 循环有什么区别
【发布时间】:2013-11-18 17:40:39
【问题描述】:

我想知道这段代码的区别:

Vertices {
int x;
int y;
};

vector<Vertices>point;
Vertices min1,max1;

i = point.begin();

min1.y = i->y;
min1.x = i->x;
max1.x = i->x;

i++;

if(i->x < min1.x)
{
    min1.x = i->x;
}
else
{
    max1.x = i->x;
}

还有这段代码:

min1.y = point[0].y;
min1.x = point[0].x;
max1.x = point[0].x;    
for (int i = 1; i < point.size(); i++) {
        if (point[i].x < min1.x)
            min1.x = point[i].x;
        else
            max1.x = point[i].x;
    }

编辑
我已经添加了为什么第二段代码从第二个元素迭代。我正在做的是比较并获得最大值和最小值。我不明白的是为什么他们给我两组不同的价值观?我是不是误会了什么?

【问题讨论】:

  • 迭代器是指针的广义抽象。它们本身不会自动循环通过容器。
  • 我猜你的意思是让你的第一个代码示例在循环中?
  • 第一个例子没有循环,第二个有。
  • @greatwolf 好吧,如果我得到第一个代码 sn-p 正确,它只运行第二个元素并通过从第一个元素到第二个元素进行比较来获得大 n 小 x。那么为什么第二个代码 sn-p 不能以相同的方式工作并得到相同的结果,因为它贯穿向量并将x 与每个元素进行比较?

标签: c++ for-loop vector iterator


【解决方案1】:

迭代器 std::vector&lt;typename&gt;::iterator itr 从向量的开头开始,默认情况下,它是 std::vector&lt;typename&gt; myVector 的第一个值。

使用数组时,您应该从第一个元素开始,即[0] 而不是[1]

这是一个在 for 循环中使用迭代器的简短示例(在我的代码中):

void Rep_C_F_in_Ex (std::vector<std::string> *vTestTwo)
{
    std::vector<std::string> vTestOne_;
    for (std::vector<std::string>::iterator itr = vTestTwo->begin(); itr != vTestTwo->end(); itr++)
    {
        boost::split_regex (vTestOne_, *itr, boost::regex (",") );

        for (std::vector<std::string>::iterator iterate = vTestOne_.begin(); iterate != vTestOne_.end(); iterate++)
        {
            vTestThree.push_back (*iterate);
            ++iterate;
            vTestFour.push_back (*iterate);
        }
    }
}

【讨论】:

  • 你能发布更多代码吗? min1max1xy 是什么?
  • 还有一件事。你的迭代器是vector&lt;Vertices&gt;::iterator i; 对吧?
  • IMO,他们应该为您提供相同的输出,如 min1.x = i-&gt;x; == min1.x = point[i].x;
  • 是的,我同意。但由于某种原因它不是。这就是我想要找出的。第一个代码 sn-p 给出了正确的值,但第二个没有。这令人费解。
  • 你试过在for循环中使用iterator吗?就像我上面的代码一样。我还没有为此使用整数。
【解决方案2】:

第一个区别是您在第一种情况下没有 循环。它只处理第一个元素。

第二个区别是,当您在第二种情况下有第 0 个元素时,您 从 1 开始。它会处理除第一个元素之外的所有元素。

即使使用迭代器,您也必须有一个循环。使用和不使用迭代器的区别只是为了方便。迭代器只是访问向量中元素的不同接口。

【讨论】:

  • 您修复了第二个错误,但您的第一个问题仍然存在,您那里没有循环。
  • 所以我说第一个代码 sn-p 只访问向量的第一个和第二个元素是对的吗?那么当第二个代码sn-p也可以实现结果时,它怎么给我正确的值呢?
  • 你是对的。好吧。您确定您的测试阵列足够好吗?代码的其他部分发生了什么?可以全部发上来吗?
【解决方案3】:

如果你想将它作为数组循环,你应该从 0 而不是 1 开始。

int i = 0;

Bettor 写如下:

for (std::vector<xxx>::iterator it = point.begin(); it != point.end; ++it)

【讨论】:

    猜你喜欢
    • 2020-11-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-29
    • 2019-10-01
    • 2011-04-01
    • 1970-01-01
    • 2012-02-10
    • 1970-01-01
    相关资源
    最近更新 更多