使用std :: list
考虑以下语句序列//class C;
C c_obj;
std::list<C> my_list;
//...
std::swap(c_obj, my_list.front());
my_list.pop_front();
我想简单地将my_list.front()的内容移动到c_obj,同时在单个语句中从列表中删除元素(从而最小化语句和复制的数量)。有可能吗?
感谢。
答案 0 :(得分:0)
我真的不认为有任何内置会为你做这件事。您可以编写自己的函数进行复制然后弹出。如果你知道你不太可能将该函数用于许多其他用途,你可以使它成为一个lambda表达式,这样它实际上只是一个语句,伪装成一个匿名函数调用。
http://en.cppreference.com/w/cpp/language/lambda
或者,您可以创建一个新列表,然后使用splice一次传输一个元素,确保没有任何内容超出范围,然后只处理新列表中元素的迭代器。
答案 1 :(得分:0)
创建一个返回弹出值的函数并使用std::exchange()
:
C& pop_front(std::list<C>& cont) {
C& c(cont.front());
cont.pop_front();
return c;
}
int main() {
C c_obj;
std::list<C> my_list;
my_list.emplace_front();
std::exchange(c_obj, pop_front(my_list));
}