矢量的一种交换方式是可能的

One way swap for vectors, is it possible?

本文关键字:方式 交换 一种      更新时间:2023-10-16

在C++98中,这就是我想要做的(这不起作用,因为_M_start等是私有成员):

void vectormove(std::vector<int>& a, std::vector<int>& b)
{
    a._M_impl._M_start = b._M_impl._M_start;
    a._M_impl._M_finish = b._M_impl._M_finish;
    a._M_impl._M_end_of_storage = b._M_impl._M_end_of_storage;
}

这就是我想呼叫的方式

//vectors are predefined already
std::vector<int> a;
std::vector<int> b(10000000,20);
//in later part of code
//a=b;  //expensive copy
//std::swap(a,b);   //inexpensive swap
vectormove(a,b);  //i need an inexpensive one way swap instead

我可能已经通过松散地使用复制、移动和交换来屠杀术语,但我对这个主题没有更好的理解。我希望我能够传达我的意图。

看起来您只是希望a引用b的内部。这样做的方法只是:

std::vector<int>& a = b;

如果您希望a接管b的内部,那就是:

std::vector<int> a = std::move(b);

其在C++03中可以实现为具有空向量的交换:

std::vector<int> a;
using std::swap;
swap(a, b);

如果你的问题是如何编写vectormove()的可编译实现,它是这样的:

// NOT USEFUL CODE
void vectormove(std::vector<int>& a, std::vector<int>& b)
{
    memcpy(&b, &a, sizeof(std::vector<int>));
}

但这是没有用的,因为一旦你做到了这一点,你就走上了未定义行为的道路。也许双倍免费,也许免费后使用,等等

似乎您最好使用常规a.swap(b)或将a存储为类型int*,如下所示:

std::vector<int> b(10000000,20);
std::pair<int*, int*> a(&b[0], &b[b.size()]);

现在您有了一个a,它可以廉价地传递,并引用原始向量。只需确保之后不会通过修改b来使a无效即可。