Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/grails/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;向量<;T>;::迭代器运算符+;_C++_Iterator_Operators - Fatal编程技术网

C++ C++;向量<;T>;::迭代器运算符+;

C++ C++;向量<;T>;::迭代器运算符+;,c++,iterator,operators,C++,Iterator,Operators,我拿着一个迭代器,它指向向量的一个元素,我想把它和向量的下一个元素进行比较 这是我的 Class Point{ public: float x,y; } //Somewhere in my code I do this vector<Point> points = line.getPoints(); foo (points.begin(),points.end()); 类点{ 公众: 浮动x,y; } //在我的代码中的某个地方我这样做 向量点=line.getPoints

我拿着一个迭代器,它指向向量的一个元素,我想把它和向量的下一个元素进行比较

这是我的

Class Point{
public:
 float x,y;
}

//Somewhere in my code I do this

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

foo (points.begin(),points.end());
类点{
公众:
浮动x,y;
}
//在我的代码中的某个地方我这样做
向量点=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.
    }
}
void foo(向量::迭代器开始,向量::迭代器结束) { std::Vector::iterator current=begin; 对于(;当前!=end-1;++当前) { std::Vector::iterator next=current+1; //比较当前和下一个。 } } 我原以为这会奏效,但
current+1
并没有给我向量的下一个元素

我认为operator+是正确的选择,但似乎不是这样。这方面有解决办法吗


谢谢

current+1
对随机访问迭代器(包括向量迭代器)有效,它是current之后的迭代器(即您认为它的功能)。检查(或发布!)您的比较代码,您可能在其中出错。

current+1
对随机访问迭代器(包括向量迭代器)有效,它是current之后的迭代器(即您认为它的功能)。检查(或张贴!)比较代码,您可能在其中出错。

std::vector
具有随机访问迭代器。这意味着它们基本上和指针一样通用。它们提供全面的指针算法(
it+5
it+=2
)和除
以外的比较=/
==
(即,
=

代码中迭代器之间的比较肯定会起作用,但毫无意义:

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
}
for(std::vector::iterator current=begin;current!=end-1;++current)
{
std::vector::iterator next=current+1;
断言(当前!=下一个);//始终为真

assert(当前
std::vector
具有随机访问迭代器。这意味着它们基本上与指针一样通用。它们提供全面的指针算法(
it+5
it+=2
)和除
!=
=
(即
=/code>)之外的比较

代码中迭代器之间的比较肯定会起作用,但毫无意义:

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
}
for(std::vector::iterator current=begin;current!=end-1;++current)
{
std::vector::iterator next=current+1;
断言(当前!=下一个);//始终为真

assert(当前可能只是输入错误,但您的代码引用的是
Vector
,而标准容器是
Vector
(小写V)


但是,如果你的问题中没有输入错误,没有看到向量的定义,就无法判断它是什么意思。

可能只是输入错误,但你的代码是指向量,而标准容器是向量(小写V)


但是,如果你的问题中没有输入错误,没有看到
向量的定义,就无法判断它是什么意思。

你能更详细地说明一下为什么你认为
下一个
不是指当前之后的元素吗?你能澄清一下“但是当前+1没有给我向量的下一个元素吗?”?只是一个小旁注:您需要说
typename Vector::iterator begin
(和
end
,和
current
)。即使代码按原样编译,标准也不要求它。一般来说,只要你有
class\u模板::some\u type obj
,你就必须在它前面加上
typename
,以确保编译器理解
some\u type
是一个类型而不是其他类型。@wilhelmtell:不,标准不要求这样,除非
Point
是一个模板参数。TTBOMK、C++98甚至不允许您对非依赖类型使用
typename
。(ISTR litb解释说C++03允许,但我不确定,而且至少有一个流行的当前编译器明确不允许。)@wilhelmtell-不正确。仅当类型依赖于另一个模板参数时,才需要使用typename。例如,
template typename vector::iterator…
能否详细说明为什么您认为
next
不是指当前之后的元素?能否澄清“但是current+1并没有给我向量的下一个元素。”?只是一个小小的旁注:您需要说
typename vector::iterator begin
(和
end
,和
current
)。即使代码按原样编译,标准也不要求它。一般来说,只要你有
class\u模板::some\u type obj
,你就必须在它前面加上
typename
,以确保编译器理解
some\u type
是一个类型而不是其他类型。@wilhelmtell:不,标准不要求这样,除非
Point
是一个模板参数。TTBOMK、C++98甚至不允许您对非依赖类型使用
typename
。(ISTR litb解释说C++03允许,但我不确定,而且至少有一个流行的当前编译器明确不允许。)@wilhelmtell-不正确。仅当类型依赖于另一个模板参数时,才需要使用typename。例如,
template typename vector::iterator…
current不应指向此循环中的最后一个元素,尽管检查
begin!=end
可能是正确的。@visitor:是的,你是对的。我复制了循环endi不看一眼就取消条件。
current不应该指向这个循环中的最后一个元素,尽管检查
begin!=end
可能是正确的。@visor:是的,你说得对。我连看都没看就复制了循环的结束条件。
确实。解决方案是1)询问S.O,2)睡一会儿。确实。解决办法是:1)询问S.O.的情况,2)睡一会儿。