【问题标题】:C++ vector<T>::iterator operator +C++ 向量<T>::迭代器运算符 +
【发布时间】:2011-02-07 07:18:07
【问题描述】:

我持有一个指向向量元素的迭代器,我想将它与向量的下一个元素进行比较。

这就是我所拥有的

Class Point{
public:
 float x,y;
}

//Somewhere in my code I do this

vector<Point> points = line.getPoints();

foo (points.begin(),points.end());

foo 在哪里:

void foo (Vector<Point>::iterator begin,Vector<Point>::iterator end)
{
    std::Vector<Point>::iterator current = begin;

    for(;current!=end-1;++current)
    {
        std::Vector<Point>::iterator next = current + 1;

        //Compare between current and next.
    }
}

我认为这会起作用,但 current + 1 没有给我向量的下一个元素。

我虽然 operator+ 是要走的路,但似乎并非如此。有解决办法吗?

谢谢

【问题讨论】:

  • 您能否详细说明为什么您认为next 不是指当前之后的元素?
  • 你能澄清一下“但是 current + 1 没有给我向量的下一个元素。” ?
  • 只是一个小旁注:你需要说typename Vector&lt;Point&gt;::iterator begin(和end,和current)。即使代码按原样编译,标准也不需要它。一般来说,只要有class_template&lt;T&gt;::some_type obj,就必须在它前面加上typename,以确保编译器理解some_type 是一个类型而不是别的东西。
  • @wilhelmtell:不,标准没有要求,除非Point 是模板参数。 TTBOMK、C++98 甚至不允许您将typename 用于非依赖类型。 (ISTR litb 解释说 C++03 允许它,但我不确定,至少一个流行的当前编译器明确禁止它。)
  • @wilhelmtell - 不正确。仅当类型依赖于另一个模板参数时才需要使用 typename。即template &lt;class T&gt; typename vector&lt;T&gt;::iterator ...

标签: c++ iterator operators


【解决方案1】:

current + 1 对随机访问迭代器(包括向量迭代器)有效,它是当前迭代器之后的迭代器(即,您认为它的作用)。检查(或发布!)您的比较代码,您可能在那里做错了什么。

【讨论】:

  • 确实如此。解决方案? 1) 在 S.O 上提问,2) 睡觉。
【解决方案2】:

std::vectorrandom-access 迭代器。这意味着它们基本上和指针一样多才多艺。它们提供成熟的指针算法(it+5it+=2)和除!=/== 以外的比较(即&lt;&lt;=&gt;&gt;=)。

在你的代码中迭代器之间的比较当然应该有效,但这是荒谬的:

for(std::vector<Point>::iterator current = begin;current!=end-1;++current)
{
    std::vector<Point>::iterator next = current + 1;

    assert(current!=next); // always true
    assert(current<next); // also always true
}

因此,如果它对您不起作用,则很可能您做错了什么。不幸的是,“......没有给我向量的下一个元素......”并没有让我们知道你在尝试什么,所以很难猜测你可能做错了什么。

【讨论】:

  • current 不应指向此循环中的最后一个元素,尽管可能需要检查 begin != end
  • @visitor:是的,你是对的。我复制了循环结束条件,甚至没有看它。 &lt;sigh&gt;
【解决方案3】:

也许这只是一个错字,但您的代码指的是Vector,而标准容器是vector(小写V)。

但是,如果这不是您的问题中的错字,没有看到 Vector 的定义,就无法判断它的作用。

【讨论】:

    猜你喜欢
    • 2020-06-14
    • 1970-01-01
    • 2011-05-18
    • 1970-01-01
    • 2013-12-16
    • 1970-01-01
    • 1970-01-01
    • 2013-02-07
    • 1970-01-01
    相关资源
    最近更新 更多