std vector iterator不支持地址算术?

时间:2014-01-02 10:35:54

标签: c++ vector iterator std

我正在实现mergeSort,我需要将主向量的子向量传递给fucntion。 我使用主向量中的迭代器初始化子向量,但它没有初始化。 请参阅bc向量。

b 应该是[5,1]而 c 应该是[7]。

我做错了什么? “符号含糊不清”是什么意思?为什么它含糊不清?

enter image description here

3 个答案:

答案 0 :(得分:3)

第二个迭代器应指向最后一个之后的一个元素。

vector<unsigned int> b(v.begin(), v.begin()+middle);
vector<unsigned int> c(v.begin()+middle, v.end());

如果您希望第一部分更大,向上middle向上而不是向零:

unsigned int middle = (v.size()+1)/2;

答案 1 :(得分:1)

Vector v有3个元素。所以v.size()/ 2将等于1.要定义向量b和c,你需要编写

std::vector<unsigned int> b( v.begin(), std::next( v.begin(), middle ) );
std::vector<unsigned int> c( std::next( v.begin(), middle ), v.end() );

考虑到向量的有效范围是

[v.begin(), std::next( v.begin(), middle ) )

[std::next( v.begin(), middle ), v.end() )

答案 2 :(得分:1)

迭代器范围半开。 begin迭代器引用范围中的第一个元素,end iterator引用一个范围中的最后一个项。这通常写为[first, one past last)

将它与你的代码放在一起,范围[v.begin() + middle + 1, v.end()-1)意味着“从中间+ 1开始到最后1结束的范围”,即你忽略了你想要的范围的第一个和最后一个元素。 / p>

要解决它,你需要在第二行中删除迭代器算术。