作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我对 C++ 比较陌生。我一直在尝试使用迭代器对 vector 进行排序。我正在使用冒泡排序。我不想知道我的冒泡排序实现是否有效,我只想知道是什么让我的程序崩溃了。
template<typename iter>
void bubbleSort(iter start, iter end) {
for (iter &j = end; j != start; j--) {
for (iter &i = start; i != end; i++) {
// std::cout << *i << std::endl;
if (*i > *(i + 1)) { // this line is where it stops
std::iter_swap(i, i + 1);
}
}
}
std::cout << "ended"; // this line never gets called
}
std::cout << *i << std::endl;
1168169449
永远。这里出了什么问题?
std::vector<int> vector = {1, 2, 3, 6, 4, 5};
std::vector<int> temp = vector;
//std::sort(temp.begin(), temp.end());
bubbleSort(vector.begin(), vector.end());
for(auto& num : vector) {
std::cout << num << std::endl;
}
最佳答案
在该行中,您正在取消引用 i + 1
,在循环的最后一次迭代中,它将取消引用 .end()
调用未定义的行为,.end()
是最后一个元素之后的一个,它不能被取消引用。
快速修复是使您的停止条件i != end - 1
.
这虽然不会修复冒泡排序实现,但对于更复杂的序列仍然存在缺陷,请采用以下样本 vector :
std::vector<int> vector = {1, 2, 7, 3, 6, 4, 5};
template<typename iter>
void bubbleSort(iter start, iter end) {
for (iter i = start + 1; i != end; i++) {
for (iter j = start; j != end - 1; j++) {
if (*i < *j) {
std::iter_swap(i, j);
}
}
}
std::cout << "ended" << std::endl;
}
template<typename iter>
void bubbleSort(iter start, iter end) {
while(start != end) {
for (iter j = start; j != end; j++) {
if (*start > *j) {
std::iter_swap(start, j);
}
}
start++;
}
std::cout << "ended" << std::endl;
}
//...
if(start == j){ // will compare the iterators and skip the loop if they are equal
continue;
}
//...
template<typename iter>
void bubbleSort(iter start, iter end) {
for (iter i = start; i != end; i++) {
for (iter j = i; j != end; j++) {
if(i == j) {
continue;
}
if (*i > *j) {
std::iter_swap(i, j);
}
}
}
std::cout << "ended" << std::endl;
}
关于c++ - 在自定义冒泡排序实现中比较迭代器崩溃程序而没有错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62162046/
我是一名优秀的程序员,十分优秀!