递归地将函数映射到向量

时间:2019-01-25 10:00:47

标签: c++ recursion mapping

我有一个名为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文件和主文件等

1 个答案:

答案 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?)。