我正在使用交换函数对矢量进行排序。 当我使用循环时:
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;
}
答案 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] ...
。