使用自动循环时代码崩溃

时间:2018-01-12 14:21:06

标签: c++ c++11

我正在使用交换函数对矢量进行排序。 当我使用循环时:

for (int i = 0; i < vec.size(); i++)

代码运行正常但我使用时: for (auto const &i:vec)

它崩溃了!

Error in ./run': free(): invalid next size (fast): 0x0000000001df0c20

#include <iostream>
#include <cstdlib>
#include <cstdio>
#include <ctime>
#include <vector>
#include <array>

template <class T>
void myswap(T &a,
            T &b)
{
    T temp = a;
    a = b;
    b = temp;
}


int main() {

    const int N = 5;
    std::vector<int> vec = {112,32,11,4,7};

    std::cout << "\nInit\n";
    for (const auto &i:vec)
    {
        std::cout << i << "\t";
    }


    int j;
    for (auto const  &i:vec)
    //for (int i = 0; i < vec.size(); i++)
    {
        j = i;
        while (j > 0 && vec[j] < vec[j-1]) 
        {
            myswap(vec[j], vec[j-1]);
            j--;
        }
    }


    std::cout << "\n\nFinal\n";
    for (const auto &i:vec)
    {
        std::cout << i << "\t";
    }

    std::cout << "\n";
    return 0;
}

3 个答案:

答案 0 :(得分:2)

在问题的评论中已经回答(基于范围的循环迭代 索引),但为了说明,试试这个:

std::vector<std::vector<int>> v;
int j;
for(auto const& i : v)
{
    j = v;
}

您很快就会发现这段代码无法编译 - 一个好的编译器会向您显示这样的错误(来自GCC):

  

错误:无法转换'std :: vector&lt; std :: vector&lt; int&gt; &GT;”分配给'int'

您现在可以做的事情如下:

std::vector<std::vector<int>> v;
for(auto const& i : v)
{
    std::vector<int> const& vv = v; // assign a reference
    std::vector<int> vvv = v;       // make a COPY(!)
}

非常自我解释,不是吗?

答案 1 :(得分:0)

可能是因为auto const尝试使用此const auto而且您正在使用j in while循环而不是i您将其更改为j in while或更改{{1} }

for(const auto &j:vec)

答案 2 :(得分:0)

从您使用swap的方式来看,j旨在表示vec的有效索引。现在i不是索引,而是一个值。当您分配j=i时,j包含明显超出范围的112

远程循环的工作方式是i在每次迭代时取值vec[0], vec[1], vec[2] ...

Read here to learn about ranged loop.