首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将临时修改的向量传递给函数

将临时修改的向量传递给函数
EN

Stack Overflow用户
提问于 2017-12-10 21:35:11
回答 4查看 112关注 0票数 2

在回溯问题中,我必须将向量传递给函数,以便在每个级别上修改该向量:

代码语言:javascript
运行
复制
void function(std::vector <int> vec){
    vec.push_back(0); // Initial modification
    function(vec);

    vec.pop_back(); // Return to previous state

    vec.push_back(1); // Second modification
    function(vec);

    return;
}

我省略了多余的代码。

有什么方法可以简化向量修改,这样以后我就不需要pop_back了?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2017-12-10 21:40:07

我发现你所拥有的已经相当可读的了。只有两点我会改进。

首先,通过引用传递向量,避免重复拷贝。

其次,为了保持回溯不变,您仍然需要维护pop_back。但你可以把它移到一个不那么尴尬的地方:

代码语言:javascript
运行
复制
void function(std::vector<int> &vec){
    vec.push_back(0); // Initial modification
    function(vec);
    vec.back() = 1;   // Second modification
    function(vec);
    vec.pop_back();   // Return to previous state
    return;
}

因为函数会弹出它推送的整数,所以我们可以肯定,vec.back()是调用之间的整数。所以你可以做简单的任务,而不是另一对弹出和推。

票数 1
EN

Stack Overflow用户

发布于 2017-12-10 21:38:54

您可以创建一个卫士类,在销毁时自动为您调用pop_back

代码语言:javascript
运行
复制
template <typename T>
class push_pop_guard
{
private:
    std::vector<T>& _v;

public:
    template <typename Item>
    push_pop_guard(std::vector<T>& v, Item&& x) : _v{v} 
    { 
        _v.push_back(std::forward<Item>(x));
    }

    ~push_pop_guard()
    {
        _v.pop_back();
    }
};

用法示例:

代码语言:javascript
运行
复制
void function(std::vector <int> vec)
{
    {
        push_pop_guard ppg{vec, 0};
        function(vec);
    }

    // ...
}
票数 3
EN

Stack Overflow用户

发布于 2017-12-10 21:52:47

您可以将值传递给该方法,并在以后将其推送到向量:

代码语言:javascript
运行
复制
void function(std::vector <int> vec, int element){
    vec.push_back(element);
    //Do stuff
    function(vec,0);
    function(vec,1);

    return;
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47743706

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档