【问题标题】:std vector iterator doesn't support address arithmetics?标准向量迭代器不支持地址算术?
【发布时间】:2014-01-02 10:35:54
【问题描述】:

我正在实现mergeSort,我需要将主向量的一个子向量传递给一个函数。 我使用来自主向量的迭代器初始化子向量,但它没有被初始化。 请参阅bc 向量。

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

我做错了什么? “符号不明确”是什么意思?为什么会模棱两可?

【问题讨论】:

  • “符号不明确”错误是调试器无法很好地处理运算符重载的症状。

标签: c++ vector iterator std


【解决方案1】:

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

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;

【讨论】:

    【解决方案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() )
    

    【讨论】:

      【解决方案3】:

      迭代器范围是半开。开始迭代器引用范围中的第一个元素,结束迭代器引用过去范围中的最后一项。这通常写成[first, one past last)

      将其与您的代码放在一起,[v.begin() + middle + 1, v.end()-1) 范围的意思是“从中间 + 1 开始到最后一个 1 结束的范围”,即您忽略了所需范围的第一个和最后一个元素。

      要解决它,您只需删除第二行中的迭代器算术即可。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-05-27
        • 2012-07-02
        • 2013-11-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多