在回溯问题中,我必须将向量传递给函数,以便在每个级别上修改该向量:
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-10 21:40:07
我发现你所拥有的已经相当可读的了。只有两点我会改进。
首先,通过引用传递向量,避免重复拷贝。
其次,为了保持回溯不变,您仍然需要维护pop_back。但你可以把它移到一个不那么尴尬的地方:
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()是调用之间的整数。所以你可以做简单的任务,而不是另一对弹出和推。
发布于 2017-12-10 21:38:54
您可以创建一个卫士类,在销毁时自动为您调用pop_back:
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();
}
};用法示例:
void function(std::vector <int> vec)
{
{
push_pop_guard ppg{vec, 0};
function(vec);
}
// ...
}发布于 2017-12-10 21:52:47
您可以将值传递给该方法,并在以后将其推送到向量:
void function(std::vector <int> vec, int element){
vec.push_back(element);
//Do stuff
function(vec,0);
function(vec,1);
return;
}https://stackoverflow.com/questions/47743706
复制相似问题