在恒定时间内交换std :: vector的内容 - 是否可能?

Bru*_*uce 2 c++ vector stdvector

std::vector用来在Image类中存储图像.我理解他们的工作方式有点麻烦.旋转图像的功能:

void Image :: resize (int width, int height)
{
    //the image in the object is "image"

    std::vector<uint8_t> vec;  //new vector to store rotated image

    // rotate "image" and store in "vec"

    image = vec; // copy "vec" to "image" (right?)

    //vec destructs itself on going out of scope
}
Run Code Online (Sandbox Code Playgroud)

有没有办法阻止最后一个副本?就像在Java中一样,只需切换引用?如果防止任何复制将是很好的.

jua*_*nza 10

你可以使用std::vector::swap:

image.swap(vec);
Run Code Online (Sandbox Code Playgroud)

这本质上是指针交换,内容是传输而不是复制.它完全有效,因为您不关心vec交换后的内容.

在C++ 11中,您可以将内容"移动" vecimage:

image = std::move(vec);
Run Code Online (Sandbox Code Playgroud)

这个操作具有基本相同的效果,除了状态vec不太明确(它处于自我一致的状态,但你不能对其内容作出任何假设......但你无论如何都不在乎,因为你知道你正在丢弃它立即).

  • 请注意,`vec`的状态未指定,但有效.因此,基本上可以`清除()`向量,也许是`resize()`,并继续使用移动的对象. (2认同)