向量订阅超出范围c ++

时间:2016-03-12 13:56:34

标签: c++

我正在开发一个程序,它从文件中读取整数,将其存储在vector中,并使用count sort对整数进行排序并将它们写入新文件中。当我运行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];
    }
}

2 个答案:

答案 0 :(得分:1)

首先,你将整个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],这会破坏您的代码。

答案 1 :(得分:0)

在向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();
}