Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/144.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++ 是否保证v.begin()和#x2B;v、 大小()==v.end()表示C++;向量v?_C++_Vector_Stl_Iterator - Fatal编程技术网

C++ 是否保证v.begin()和#x2B;v、 大小()==v.end()表示C++;向量v?

C++ 是否保证v.begin()和#x2B;v、 大小()==v.end()表示C++;向量v?,c++,vector,stl,iterator,C++,Vector,Stl,Iterator,尝试将值>代码>插入到C++ vector v>代码> >代码> > ->元素(或元素(I-1) >之后。代码非常简单 v.insert(v.begin() + i, value); 我确信当I包含在0和v.size()之间时,此语句会起作用。此外,我认为当I严格大于v.size()或负值时,该语句具有未定义的行为。但是如果i==v.size()呢?那么v.begin()+i是有效的迭代器吗?是否保证v.begin()+v.size()==v.end() 如果有保证,您能参考标准的确切部分

尝试将值>代码>插入到C++ vector <代码> v>代码> >代码> > <代码> ->元素(或元素<代码>(I-1) >之后。代码非常简单

v.insert(v.begin() + i, value);
我确信当
I
包含在0和
v.size()
之间时,此语句会起作用。此外,我认为当
I
严格大于
v.size()
或负值时,该语句具有未定义的行为。但是如果
i==v.size()
呢?那么
v.begin()+i
是有效的迭代器吗?是否保证
v.begin()+v.size()==v.end()

如果有保证,您能参考标准的确切部分吗?此外,如果保证在标准版本之间发生变化,了解这些变化将非常有用

如果没有这些保证,我可能应该使用以下代码:

if (i == v.size()) {
    v.insert(v.end(), value); // or just v.push_back(value);
} else {
    v.insert(v.begin() + i, value);
}
但是,像在这个问题的开头那样,只使用一行会更简洁。在实践中,这个问题开头的代码是有效的,但我想确保它在任何地方都有效。我试图搜索标准,但找不到随机访问迭代器的此属性。

如上所述

pos-将插入内容的迭代器pos可以是end()迭代器

因此,可以使用
end()
。至于你的另一个问题:

是否保证v.begin()+v.size()==v.end()

是的,否则此循环:

for( auto it = vec.begin(); it != vec.end(); ++it ) ...
无法正常工作,因为它必须准确地执行
++it
vec.size()
次。

如上所述

pos-将插入内容的迭代器pos可以是end()迭代器

因此,可以使用
end()
。至于你的另一个问题:

是否保证v.begin()+v.size()==v.end()

是的,否则此循环:

for( auto it = vec.begin(); it != vec.end(); ++it ) ...

无法正常工作,因为它必须准确地执行
++it
vec.size()

您似乎在问两个不同的问题。一个是关于insert()的操作,另一个是关于比较迭代器。@NeilButterworth我希望不是,insert只是一个应用程序。我们应该为它提供一个有效的迭代器,然后它就可以正常工作了。v.begin()+v.size()的唯一可能有效值是v.end()。但我不确定它是否保证有效。“仅仅因为你是偏执狂并不意味着他们不在追你。”你似乎在问两个不同的问题。一个是关于insert()的操作,还有一个是关于比较迭代器的。@NeilButterworth我希望不是,insert只是一个应用程序。我们应该为它提供一个有效的迭代器,然后它就可以工作了。v.begin()+v.size()唯一可能的有效值是v.end()。但我不确定它是否保证有效。”仅仅因为你是偏执狂并不意味着他们不在追你。”你用循环例子的证明看起来是有效的。您能否另外引用关于随机访问迭代器的
+x
操作与
x
操作的等价性的标准?这是完全合乎逻辑的,但我需要一点更有力的证明。这足够好吗?非常好的表格,非常好的解释。我在标准中找了这张桌子,却找不到。你能帮我在那里找到它吗?打开“24.2.7随机访问迭代器”,你会在那里找到一个表,你用for循环例子的证明看起来是有效的。您能否另外引用关于随机访问迭代器的
+x
操作与
x
操作的等价性的标准?这是完全合乎逻辑的,但我需要一点更有力的证明。这足够好吗?非常好的表格,非常好的解释。我在标准中找了这张桌子,却找不到。你能帮我找到它吗?打开“24.2.7随机访问迭代器”,你会在那里找到表