2014-09-28 61 views
6

我有vector<T, alloc>其中allocstd::allocator<T>上的一个简单包装,它执行一些额外的簿记工作,如计算创建的对象数量等。从带有一个分配器的矢量移动到另一个矢量

现在我想从我的vector<T, alloc>转入vector<T>。矢量移动函数似乎都不能接受具有不同分配器的sdl。

如何将数据从一个向量移动到另一个分配器不相同的地方?

+0

我想你问的非常有意义但不幸的是,矢量是以一种不允许的方式来定义/实现的。我认为目前不可能,但应该是。我能想到的唯一选择是对特殊分配器的向量的某种特化。 – alfC 2017-10-01 09:21:42

回答

3

正如John Zwinck在他的回答中解释的那样,你不能移动矢量。但是,您可以按如下移动向量的元素:

vector<...> u; 
... 
vector<...> v(
    std::make_move_iterator(u.begin()), 
    std::make_move_iterator(u.end()) 
); 

vector<...> u; 
vector<...> v; 
... 
v.insert(
    v.end(), 
    std::make_move_iterator(u.begin()), 
    std::make_move_iterator(u.end()) 
); 

或(由Oktalist建议)

vector<...> u; 
vector<...> v; 
... 
std::move(u.begin(), u.end(), std::back_inserter(v)); 
+0

这是一个很好的观点,但我理解这个问题的方式是关于将矢量数据从一个移动到另一个的愿望。例如,如果你有一个巨大的整数向量,你可能想要避免复制它们,'move_iterator'似乎没有帮助。我想这取决于问题的最初原因是来自大型小物体矢量还是其他方式。 – 2014-09-28 09:24:19

+0

@John Zwinck我同意。这不完全是OP想要的,但也许最好的人可以做。 – user763305 2014-09-28 09:26:07

+2

'std :: move(u.begin(),u.end(),std :: back_inserter(v));'作为第二种情况的替代方案。 – Oktalist 2014-09-28 10:59:04

3

这确实是一个关于STL的奇怪的事情。您需要将insert()源矢量的值输入到目标矢量中。或者你可以使用几个备用宇宙STL实现直接解决这一问题之一,例如:

一些谁作出了上述准STL实现试图让他们的分配模式的变化通过到C的乡亲++标准,但他们没有成功。

+0

我不能'插入()'它们,因为没有足够的异常安全保证擦除源矢量,然后插入新的元素。 – Puppy 2014-09-28 10:07:18

+0

你的T是什么?也许你可以在这里使用'move_iterator'来考虑其他的答案,如果你的T是可移动的,或者从源代码交换到dest,或者甚至可以重新考虑为什么你需要一个自定义分配器(你可以通过其他方式获得内存分配度量平台)。 – 2014-09-28 10:18:45

相关问题