首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
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

Stack Overflow用户

发布于 2017-12-11 21:22:00

代码语言:javascript
运行
复制
template<class F>
struct scope_guard_t {
  std::optional<F> f;
  scope_guard_t( F in ):f(std::move(f)) {}
  scope_guard_t( scope_guard_t&& o ):
    f(std::move(o.f))
  {
    o.clear();
  }
  void abandon() { clear(); }
  void commit_early() { commit(); clear(); }
  ~scope_guard_t() { commit(); }
private:
  void commit() { if(f) (*f)(); }
  void clear() { f = std::nullopt; }
};
template<class F>
scope_guard_t<F> scope_guard( F in ) { return {std::move(in)}; }

template<class C, class T>
auto temp_push( C& c, T&& t ) {
  c.push_back( std::forward<T>(t) ); // do
  return scope_guard(
    [&]{ c.pop_back(); } // undo
  );
}
void function(std::vector <int> vec){
  {
    auto scope = temp_push( vec, 0 );
    function(vec);
  }

  {
    auto scope = temp_push( vec, 1 );
    function(vec);
  }
}

std::optional可以在c++14和以前用boost::optional代替。

scope_guard通常是有用的。

我还将通过传递引用来替换按值传递的vector;这可能会更有效,因为它避免了为每个递归重新分配它。

票数 1
EN
查看全部 4 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47743706

复制
相关文章

相似问题

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