如何将数据从`boost :: scoped_array`复制到`std :: vector`

时间:2012-10-26 14:38:47

标签: c++ boost stl std

vector<int> vec;
boost::scoped_array<int> scpaInts;

scpaInts.reset(new int[10]);

for (int i=0; i<10; i++)
    scpaInts[i] = i*2;

vec.assign(&scpaInts[0], &scpaInts[9]+1);      // => method one
vec.assign(scpaInts.get(), scpaInts.get()+10); // => method two

问题1&gt; 我找到了两种方法。但我不确定它们是否正确或有更好的方法来做到这一点。

问题2&gt;我们无法从boost :: scoped_array中获取有效长度吗?

谢谢

5 个答案:

答案 0 :(得分:3)

问题1:两种方法都可以。指向数组元素的指针可以扮演随机访问迭代器的角色。这个也很好

vec.assign(&scpaInts[0], &scpaInts[10]);

问题2:这是正确的,因为你无法获得传递给函数的C风格数组的长度。

答案 1 :(得分:1)

两者都可以。但第二个对我来说更清楚。 boost::scoped_array作为简单数组工作,您现在无法获得数据大小。要将其复制到矢量,您必须知道它的大小。  Here是关于scoped_array迭代器和大小的链接。

答案 2 :(得分:1)

我选择方法2:

vec.assign(scpaInts.get(), scpaInts.get()+10); // => method two

与普通动态数组类似:

int * a = new int[10];
...
vec.assign(a, a+10); // => method two

当然,方法1也适用,例如动态数组:

vec.assign(&a[0], &a[9]+1); // => method one

正如您所看到的 - 方法2看起来更简单,因此更好。


而且,不,在作用域数组中没有size()方法。

答案 3 :(得分:1)

问题1:两种方法都是正确的。

问题2:正确,它只是一个类似于std :: scoped_ptr的容器,它确保传递的指针(使用operator new[]手动创建)将使用operator delete []删除。它没有任何关于数组大小的信息。

答案 4 :(得分:1)

这两种方法对我来说都是正确的,但第二种方法肯定更清晰,因为你没有将偏移分成91组件。还有另外两个选择:

vec.assign(&scpaInts[0], &scpaInts[0] + 10);

或者在您需要之前不要创建矢量(最好的选项):

vector<int> vec(scpaInts.get(), scpaInts.get() + 10);