c++ - Visual Studio 错误:在使用向量实现 QuickSort 时“无法在开始之前寻找向量迭代器”
问题描述
我试图使用向量和迭代器来实现快速排序。但是编译器给了我一个错误,比如:“Cannot seek vector iterator before begin”。我不明白为什么,因为代码适用于 Codeblocks。谁能帮我?有一种方法可以输入向量的大小并使用 rand 自动生成它。此外,我添加了一种在快速排序之前和之后打印向量的方法。
#include <iostream>
#include <vector>
#include <ctime>
#include <cstdlib>
using namespace std;
void printVector(vector<int> v) {
for (auto i = v.begin(); i < v.end(); i++)
cout << " " << *i;
cout << endl;
}
void printVectorIterator(vector<int>::iterator begin, vector<int>::iterator end) {
for (auto i = begin; i < end; i++)
cout << " " << *i;
cout << endl;
}
vector<int>::iterator Partition(vector<int>::iterator begin, vector<int>::iterator end) {
auto partitionIndex = begin;
auto pivot = end;
for (auto i = begin; i < end; i++) {
if (*i <= *pivot) {
iter_swap(i, partitionIndex);
partitionIndex++;
}
}
cout << "pivot" << *pivot << endl;
iter_swap(partitionIndex, pivot);
return partitionIndex;
}
void QuickSort(vector<int>::iterator begin, vector<int>::iterator end) {
if (begin < end) {
auto q = Partition(begin, end);
QuickSort(begin, q - 1);
QuickSort(q + 1, end);
}
}
vector<int> random_vector() {
int n;
vector<int> A;
cout << "Size of the vector: ";
cin >> n;
srand((unsigned)time(0));
for (auto i = 0; i < n; i++) {
int random_integer = 1 + rand() % 100;
A.push_back(random_integer);
}
return A;
}
int main() {
vector<int> A = random_vector();
cout << "\nUnsorted vector: " << endl;
printVector(A);
QuickSort(A.begin(), A.end() - 1);
cout << "\nSorted vector: " << endl;
printVector(A);
return 0;
}
解决方案
在Quicksort
函数中,如果Partition(begin, end)
设置q
为begin
或end
然后您可能会遇到问题。所以你需要一张支票。
void QuickSort(vector<int>::iterator begin, vector<int>::iterator end) {
if (begin < end) {
auto q = Partition(begin, end);
if (q != begin) QuickSort(begin, q - 1);
if (q != end) QuickSort(q + 1, end);
}
}
推荐阅读
- mysql - Mysql在提供后从下一行开始选择接下来的1000行
- android - MPAndroidChart 如何将信息视图添加到轴?
- ios - 访问字典数组的嵌套数组
- javascript - 使用 axios POST 时出现错误
- ssl - 从 conda 提示符安装任何软件包时出现 SSL 错误
- c# - 设置相对于最后一行文本的光标位置 | C# 控制台应用程序
- java - Android MVP - 我应该从哪里阅读 Textview?
- ios - UIScrollView + LargeTitle (iOS 11) - 滚动到顶部并显示大标题
- java - 数组变量基本类型
- html - 限制每个会话的 CSS 动画