【发布时间】:2014-01-02 10:35:54
【问题描述】:
我正在实现mergeSort,我需要将主向量的一个子向量传递给一个函数。
我使用来自主向量的迭代器初始化子向量,但它没有被初始化。
请参阅b 和c 向量。
b 应该是 [5,1] 而 c 应该是 [7]。
我做错了什么? “符号不明确”是什么意思?为什么会模棱两可?
【问题讨论】:
-
“符号不明确”错误是调试器无法很好地处理运算符重载的症状。
我正在实现mergeSort,我需要将主向量的一个子向量传递给一个函数。
我使用来自主向量的迭代器初始化子向量,但它没有被初始化。
请参阅b 和c 向量。
b 应该是 [5,1] 而 c 应该是 [7]。
我做错了什么? “符号不明确”是什么意思?为什么会模棱两可?
【问题讨论】:
第二个迭代器应该指向最后一个之后的一个元素。
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;
【讨论】:
向量 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() )
【讨论】:
迭代器范围是半开。开始迭代器引用范围中的第一个元素,结束迭代器引用过去范围中的最后一项。这通常写成[first, one past last)。
将其与您的代码放在一起,[v.begin() + middle + 1, v.end()-1) 范围的意思是“从中间 + 1 开始到最后一个 1 结束的范围”,即您忽略了所需范围的第一个和最后一个元素。
要解决它,您只需删除第二行中的迭代器算术即可。
【讨论】: