矢量的一种交换方式是可能的
One way swap for vectors, is it possible?
在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
无效即可。
相关文章:
- 如何在c++中为模板函数实例创建快捷方式
- 在c代码之间共享数据的最佳方式
- 在C++中将函数压缩为两种方式
- 以螺旋方式打印矩阵的程序.(工作不好)
- 为字符串中每 N 个字符插入空格的函数没有按照我认为的方式工作?
- C++嵌套if语句,基本货币交换
- 创建引用向量的优雅方式
- Constexpr替代了新的放置方式,可以让内存中的对象保持未初始化状态
- shell排序中的交换和比较
- 使用QQuickFramebufferObject时同步数据的最佳方式是什么
- 不同/较旧的处理器运行c++代码的方式是否不同
- 以原子方式交换指针与 nullptr
- 如何以通用方式交换两个值
- 矢量的一种交换方式是可能的
- MATLAB和C++之间最有效的数据交换方式
- 在 UNIX 进程之间交换中等量数据的最佳方式是什么?
- 在内存映射文件中交换字节的有效方式
- 如果需要,我将如何以编程方式访问或打开交换 edb 文件
- 有效的交换文件内容的方式
- 交换工会的正确方式