矢量订阅超出范围的 C++

vector subscription out of range c++

本文关键字:范围 C++      更新时间:2023-10-16

我正在开发一个程序,该程序从文件中读取整数,将其存储在向量中,并使用计数排序对整数进行排序并将它们写入新文件中。当我运行 Countsort 函数时,我的问题出现,断点发生在这个 for 循环中:

for (int i = 0; i < C.size(); i++) {
    C[A[i]] = C[A[i]] + 1;
}

我的代码如下所示:

    //COUNT SORT
void countsort() {
    int max = A[0];
    for (int i = 1; i < A.size(); i++) {
        if (A[i] > max) { 
            max = A[i];
        }
    }
    //cout << "NAJVECJE STEVILO JE: " << max << endl; SAMO ZA TEST
    vector<int> C(max + 1);
    vector<int> B(A.size()); 
    for (int i = 0; i < C.size(); i++) {
        C[A[i]] = C[A[i]] + 1;
    }
    for (int i = 1; i < C.size(); i++) {
        C[i] = C[i] + C[i + 1];
    }
    for (int i = C.size() - 1; i >= 0; i--) {
        B[C[A[i]] - 1] = A[i];
        C[A[i]] = C[A[i]] - 1;
    }
    for (int i = 0; i < A.size(); i++) {
        A[i] = B[i];
    }
}

首先将整个C向量归零

for (int i = 0; i < C.size(); i++)
{ 
    C[i] = 0;
}

在第二个循环中,您不能更改C[0]因此它将保持0

for (int i = 0; i < A.size(); i++)
{
    C[A[i]] = C[A[i]] + 1;
}

在我的分析的第三个循环中,你永远不会改变C[0]

for (int i = C.size() - 1; i > 0; i-- )
{
    C[i] = C[i] + C[i - 1];
}

在最后一个循环中

for (int i = A.size() - 1; i >= 0; i--)
{
    B[C[A[i]] - 1] = A[i];
    C[A[i]] = C[A[i]] - 1;
    cout << B[i] << " ";
}

A[i]可能等于0,所以C[A[i]]C[0]的,它可能等于对先前循环的分析0。当你从中减去1时,你最终会得到破坏你的代码的B[-1]

在你为向量写东西之前B你可能应该像C一样初始化它。

B = vector<int>(A.size());

此外,我没有看到打印B[i]的任何意义,因为当您打印它时可能不会为其分配任何值。

编辑 #1

您的循环不正确。看看这个:

for (int i = 1; i < C.size(); i++) {
    C[i] = C[i] + C[i - 1];
}

编辑 #2

试试这段代码。

vector<int> A, B;
//COUNT SORT
void countsort() {
    int max = A[0];
    for (int i = 1; i < A.size(); i++) {
        if (A[i] > max) {
            max = A[i];
        }
    }
    vector<int> C(max + 1);
    B = vector<int>(A.size());
    for (int i = 0; i < C.size(); i++) C[i] = 0;
    for (int i = 0; i < A.size(); i++) C[A[i]] = C[A[i]] + 1;
    for (int i = 1; i < C.size(); i++) C[i] = C[i] + C[i - 1];
    for (int i = A.size() - 1; i >= 0; i--) {
        B[C[A[i]] - 1] = A[i];
        C[A[i]] = C[A[i]] - 1;
    }
    for (int i = 0; i < B.size(); i++) cout << B[i];
}
int main(void) {
    A.push_back(1);
    A.push_back(2);
    A.push_back(3);
    A.push_back(4);
    A.push_back(2);
    A.push_back(2);
    A.push_back(1);
    countsort();
}