实现快速排序时,矢量迭代器不可解除引用

时间:2015-05-30 04:17:58

标签: c++

我知道有几个关于这个问题的帖子,但我似乎无法完全理解原因(我仍然是C ++的新手,3个月的经验) 我想要做的是在struct的向量上实现quicksort(我知道有一个内置的qsort函数,但我想知道事情是如何工作的)。 这是我的快速排序代码(通过比较word.freq排序):

int partition(vector<word> &database, int start, int end) //partition the vector
{
    word pivot = database[end];
    int pIndex = start;
    for (int i = pIndex; i < end; i++)
    {
        if (database[i].freq > pivot.freq)
        {
            iter_swap(database.begin() + pIndex, database.begin() + i);
            pIndex++;
        }
    }
    iter_swap(database.begin() + pIndex, database.end());
    return pIndex;
}
void quickSort(vector<word> &database, int start, int end)
{
    if (start < end)
    {
        int partitionIndex = partition(database, start, end);
        quickSort(database, start, partitionIndex - 1);
        quickSort(database, partitionIndex + 1, end);
    }
}

请任何人澄清我的代码中的错误。所有批评都表示赞赏。我想学习。谢谢。

1 个答案:

答案 0 :(得分:1)

end()不会将迭代器返回到向量的元素。它将迭代器返回到最后一个元素之后的一个元素。所以这一行可能是你问题的原因。

iter_swap(database.begin() + pIndex, database.end());

尝试将database.begin() + pIndex处的元素与database.end()处的元素交换,该元素无效。它将涉及database.end()的解除引用,这解释了为什么你得到消息&#34;迭代器不能解引用&#34;。如果你想与最后一个元素交换,你会这样做:

iter_swap(database.begin() + pIndex, database.end() - 1);