我有一个名为mapTriple的类,该类具有一个方法,该方法采用整数向量,并将vector中的所有值乘以mapTriple类的私有函数(该函数采用int,并返回int * 3)
我已经设置了将整数三倍的类和函数。我被困在mapTriple方法上。该方法不能迭代,必须是递归的。
vector<int> MapTriple::map(vector<int> myVector)
{
if(myVector.size() == 1)
{
myVector[0] = f(myVector[0]);
return myVector;
}
else
{
map(myVector.erase(myVector.begin()+myVector.size()-1));
myVector[myVector.size()-1] = f(myVector[myVector.size()-1]);
return myVector;
}
}
int f (int a)
{
return (a*3);
}
当前未在编译,也就是说没有匹配的map调用。我有所有的.h文件和主文件等
答案 0 :(得分:4)
erase
不返回修改后的向量。它在删除的元素之后返回一个迭代器(在您的情况下为end
,因此您不需要这样做)。只需传递修改后的向量本身即可。
您当前不重新添加已擦除的元素,因此即使编译了代码,也始终会返回一个长度为1的向量(如果该向量为n
,则其余元素将被三倍n
倍)原始大小为else
{
// Store and remove the last element.
int currentElement = myVector.back();
myVector.erase(myVector.end()-1);
// Recursively process the remaining elements.
map(myVector);
// Process and re-add the above element.
myVector.push_back(f(currentElement));
return myVector;
}
)。
正确的else分支应该是:
using Iterator = std::vector<int>::iterator;
void MapTriple::map(Iterator start, Iterator end)
{
// No elements remaining?
if (start == end)
return;
// Process first element.
*start = f(*start);
// Process remaining elements recursively.
map(start+1, end);
}
但是,您可以使用迭代器来代替擦除元素并重新添加它们。
for
虽然这非常优雅,但通过简单的for (auto& e : myVector) e = f(e);
循环执行此操作当然会更加简单:
std::transform
或std::transform(myVector.begin(), myVector.end(), myVector.begin(),
[this](int e) -> { return f(e); });`
:
map
还应注意,using namespace std;
可能是此方法的中等名称,如果您似乎确实这样做的话,const
(另请参见Why is "using namespace std" considered bad practice?)。