在回溯问题中,我必须将向量传递给函数,以便在每个级别上修改该向量:
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了?
发布于 2017-12-11 21:22:00
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;这可能会更有效,因为它避免了为每个递归重新分配它。
https://stackoverflow.com/questions/47743706
复制相似问题