push_back()后向量下标超出范围

时间:2018-01-12 19:48:01

标签: c++ vector push

当我push_back到vector<vector<vector<int>>> wynik值时,我在第1796行继续得到一个错误向量下标超出范围。我使用调试器来查看我得到它的哪一行,并用&lt; ---标记给你------。我是初学者所以请帮助我,因为我不知道出了什么问题。提前感谢您的回答。

以下是代码:

vector<vector<vector<int>>> most(vector<vector<int>> poczatek, int ilosczestawow)
{
    vector<vector<vector<int>>> wynik;
    vector<int> czas;
    for (int z = 0;z < ilosczestawow;z++)
{
    int A = dwanajmniejsze(poczatek[z])[0];
    int B = dwanajmniejsze(poczatek[z])[1];
    for(int i=1; poczatek[z].size()>3 ;i=i+4)
    { 
        int C = dwanajwieksze(poczatek[z])[1];
        int D = dwanajwieksze(poczatek[z])[0];

        if (A + C < 2 * B)
        {
            int czas1 = 2 * A + C + D;
            czas.push_back(czas1);
            int iC = znajdzindeks(poczatek[z], C);
            poczatek[z].erase(poczatek[z].begin() + iC);
            int iD = znajdzindeks(poczatek[z], D);
            poczatek[z].erase(poczatek[z].begin() + iD);
            wynik[z][i].push_back(A);
            wynik[z][i].push_back(C);
            wynik[z][i+1].push_back(A);
            wynik[z][i+2].push_back(A);
            wynik[z][i+2].push_back(D);
            wynik[z][i+3].push_back(A);

        }
        else
        {
            int czas2 = A + 2 * B + D;
            czas.push_back(czas2);
            int iC = znajdzindeks(poczatek[z], C);
            poczatek[z].erase(poczatek[z].begin() + iC);
            int iD = znajdzindeks(poczatek[z], D);
            poczatek[z].erase(poczatek[z].begin() + iD);
            wynik[z][i].push_back(A); <---------------- At this line i get an error.
            wynik[z][i].push_back(B);
            wynik[z][i + 1].push_back(A);
            wynik[z][i + 2].push_back(C);
            wynik[z][i + 2].push_back(D);
            wynik[z][i + 3].push_back(B);
        }
    }
    if (poczatek[z].size() == 3)
    {
        int C = dwanajwieksze(poczatek[z])[0];
        int czas3 = B + A + C;
        czas.push_back(czas3);
        poczatek[z].erase(poczatek[z].begin(), poczatek[z].end());
        wynik[z][wynik[z].size() + 1].push_back(A);
        wynik[z][wynik[z].size()].push_back(B);
        wynik[z][wynik[z].size() + 1].push_back(A);
        wynik[z][wynik[z].size() + 1].push_back(A);
        wynik[z][wynik[z].size()].push_back(C);
    }
    if (poczatek[z].size() == 2)
    {
        int czas4 = B + A;
        czas.push_back(czas4);
        poczatek[z].erase(poczatek[z].begin(), poczatek[z].end());
        wynik[z][wynik[z].size() + 1].push_back(A);
        wynik[z][wynik[z].size()].push_back(B);
    }
    wynik[z][0].push_back(suma(czas));
}
return wynik;

}

1 个答案:

答案 0 :(得分:1)

        wynik[z][i].push_back(A);
        wynik[z][i].push_back(C);
        wynik[z][i+1].push_back(A);
        wynik[z][i+2].push_back(A);
        wynik[z][i+2].push_back(D);
        wynik[z][i+3].push_back(A);
if块中的

else块中的类似行是一个问题,因为它们使用无效的索引访问wynik。您需要将以上行替换为:

        // Create 1D vectors
        std::vector<int> v1;
        v1.push_back(A);
        v1.push_back(C);

        std::vector<int> v2;
        v2.push_back(A);

        std::vector<int> v3;
        v3.push_back(A);
        v3.push_back(D);

        std::vector<int> v4;
        v4.push_back(A);

        // Create 2D vector by pusing 1D vectors to it.
        std::vector<std::vector<int>> v5;
        v5.push_back(v1);
        v5.push_back(v2);
        v5.push_back(v3);
        v5.push_back(v4);

        // Push the 2D vector to wynik
        wynik.push_back(v5);

必须对else块进行类似的更改。