gpt4 book ai didi

C++:如何在不使用算法库中的排序函数的情况下按字母顺序排列字符串 vector

转载 作者:行者123 更新时间:2023-12-02 09:54:37 25 4
gpt4 key购买 nike

我有一个字符串 vector ,其中所有字符串都已转换为大写,以便进行比较。我需要使用 for 循环来按字母顺序排列我的 vector 。我需要按字母顺序排列现有 vector 而不是创建一个新 vector 。这是我的函数定义:

void alpha(vector <string>& words){
int minPos;
int i = 0;
for (i = 0; i < words.size(); i++) {
minPos = i;
for (int k = i + 1; k < words.size(); k++) {
if (words.at(i) < words.at(k)) {
minPos = k;
}
}
}
string temp = words.at(minPos);
words.at(minPos) = words.at(i);
words.at(i) = temp;
}

这是调用此函数时我当前在 main.cpp 中遇到的错误:
libc++abi.dylib: terminating with uncaught exception of type std::out_of_range: vector

我知道这意味着我可能试图达到一个超出范围的索引,但我不确定这会在哪里,或者我是否在开始时就走上了正确的轨道。我将不胜感激任何指导。

最佳答案

您正在 i 之后进行交换操作循环结束,其中 i现在设置为 words.size() .由于允许的索引是 0通过 words.size() - 1包括在内,这会产生越界错误。

您需要将交换操作移动到该循环内:

void alpha(vector <string>& words) {
// For each possible position in the collection.

for (int i = 0; i < words.size(); ++i) {
// Locate next lowest element (it should be in that position).

int minPos = i;
for (int k = i + 1; k < words.size(); ++k) {
if (words.at(minPos) < words.at(k)) {
minPos = k;
}
}

// If not already there, swap it with what is there.

if (i != minPos) {
string temp = words.at(minPos);
words.at(minPos) = words.at(i);
words.at(i) = temp;
}
}
}

您还将看到一些其他改进,即:
  • 将变量的范围最小化到它们应该使用的地方(如果你用 i 做到了这一点,编译不正确的代码是不可能的)。
  • 如果正确的项目已经在正确的位置,则不会执行不必​​要的交换操作。
  • 修复了检测后续项目是否应覆盖当前项目的方式中的一个小错误(基本上,使用 minPos 而不是 i )。
  • 添加评论。我怎么强调这几乎总是编码时应该首先完成的事情。


  • 顺便说一句,我只能假设这是类作业,因为当标准库中有更合适的东西时,没有人(a)会选择使用手动方法:
    std::sort (words.begin(), words.end());

    而且只有一个小调。您使用变量 minPos但您的实际比较代码将从最大到最小对数组进行排序。所以你应该调用 maxPos ,或将比较更改为相反的含义(使用 > 从小到大排序)。

    (a) 显然不包括教师:-)

    关于C++:如何在不使用算法库中的排序函数的情况下按字母顺序排列字符串 vector ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61266109/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com