我不断得到这个段错,但我不知道它来自哪里。 对不起,我还不熟悉编码。
#include <iostream>
#include <vector>
using namespace std;
vector<int> map(vector<int> v, vector<int>::iterator i, vector<int> result) { //set i = v.begin() in main
if (i==v.end()) {
return result;
} else {
result.push_back((*i)*(*i));
i++;
map(v,i,result);
}
}
int main() {
vector<int> v;
vector<int> result;
for (int i=0;i<20;i++) {
v.push_back(i);
}
vector<int>::iterator it=v.begin();
result=map(v,it,result);
}
显然,我需要添加更多单词,因为我的问题主要是代码。
答案 0 :(得分:2)
您按值传递向量,因此更改不会在函数调用中持续存在。
通过引用传递向量来实现此目的。
此外,您还需要在else案例中返回向量。
此外,也可以通过引用传递v
,以便在yuo检查v.end()
时迭代器可以正常。否则,它会在每个函数调用中查找v
的不同副本。
把所有东西放在一起,你得到:
vector<int> map(vector<int>& v, vector<int>::iterator i, vector<int>& result) {
if (i==v.end()) {
return result;
} else {
result.push_back((*i)*(*i));
i++;
return map(v,i,result);
}
}
答案 1 :(得分:1)
有两个问题:
由于您按值传递了第一个参数(std::vector
),因此对map
的每次调用都使用与原始不同的向量。因此,您传递的迭代器与传入的向量不兼容,并且您的程序将显示未定义的行为。
要解决此问题,请按引用传递std::vector
,而不是按值传递。由于您也未更改函数中的vector
,因此请转到const
引用:
vector<int> map(const vector<int>& v, vector<int>::iterator i, vector<int> result)
现在迭代器正在迭代传入的实际向量,而不是向量的临时副本。
第二个问题是您没有从map
函数返回值。不返回应该返回值的函数的值是未定义的行为。
要解决此问题,请删除else
语句(以避免任何编译器警告)并从函数中返回值:
vector<int> map(const vector<int>& v, vector<int>::iterator i, vector<int> result)
{
if (i == v.end())
return result;
result.push_back((*i)*(*i));
i++;
return map(v, i, result);
}
答案 2 :(得分:0)
问题几乎可以肯定是因为您在许多情况下都没有从递归函数返回值:
vector<int> map(vector<int> v, vector<int>::iterator i, vector<int> result) { //set i = v.begin() in main
if (i==v.end()) {
return result;
} else {
result.push_back((*i)*(*i));
i++;
map(v,i,result);
/** NO RETURN VALUE HERE **/
}
}
相反,最后一行是:
return map(v,i,result);
理想情况下,您不会按值传递向量,但这不会导致程序崩溃,只是运行得更慢。
答案 3 :(得分:0)
崩溃的一个潜在原因是因为递归调用后面没有(或部分)返回语句。当调用者访问返回值时,结果是未定义的行为。
即使忽略这一点,参数也是按值传递的。因此,对向量所做的任何更改都不会对调用者可见。更重要的是,测试i == v.end()
也将具有未定义的行为(另一个可能的崩溃原因),因为i
和v.end()
不是从同一容器获取的迭代器(i
是来自main()
中向量的迭代器,v
是该向量的副本 - 它有一组完全不同的迭代器。)
最后,std::map
是标准库中的模板化类型。拥有一个名为map()
的函数 - 特别是当using namespace std
正在运行时,可能会使编程人员感到困惑,如果不会导致编译器模糊不清。