7
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>我想出了两种方法。但我不确定它们是否正确或有更好的方法来做到这一点。

问题 2> 是否真的无法从 boost::scoped_array 中获取有效长度?

谢谢

4

5 回答 5

3

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

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

问题 2:这与您无法将 C 样式数组的长度传递给函数的原因相同。

于 2012-10-26T14:46:27.763 回答
1

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

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

于 2012-10-26T14:50:56.557 回答
1

Both methods seem correct to me, but the second is definitely clearer since you aren't splitting the offset into 9 and 1 components. There are also two other options:

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

Or don't create the vector before you need it (best of all the options):

vector<int> vec(scpaInts.get(), scpaInts.get() + 10);
于 2012-10-26T15:14:44.380 回答
1

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

于 2012-10-26T14:45:59.400 回答
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()方法。

于 2012-10-26T14:47:23.643 回答