C ++:将STL容器中的元素移动到单个语句中的变量中?

时间:2016-03-24 19:29:18

标签: c++ stl

使用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,同时在单个语句中从列表中删除元素(从而最小化语句和复制的数量)。有可能吗?

感谢。

2 个答案:

答案 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));
}