C++ 如何将数据从“boost::scoped_array”复制到“std::vector”` vec; boost::作用域的_数组; scpaInts.reset(新整型[10]); 对于(int i=0;i)方法1 向量赋值(scpaInts.get(),scpaInts.get()+10);//=>方法二

C++ 如何将数据从“boost::scoped_array”复制到“std::vector”` vec; boost::作用域的_数组; scpaInts.reset(新整型[10]); 对于(int i=0;i)方法1 向量赋值(scpaInts.get(),scpaInts.get()+10);//=>方法二,c++,boost,stl,std,C++,Boost,Stl,Std,问题1> 我想出了两种方法,但我不确定它们是否正确,或者是否有更好的方法 问题2>我们是否确实无法从boost::scoped_数组中获取有效长度 谢谢两个都可以。但是第二个对我来说更清楚。boost::scoped_array作为简单的数组工作,您现在无法确定数据的大小。要将其复制到vector,您必须知道它的大小。 是关于作用域数组迭代器和大小的链接。问题1:两种方法都可以。指向数组元素的指针可以扮演随机访问迭代器的角色。这个方法也可以 vector<int> vec; boos

问题1> 我想出了两种方法,但我不确定它们是否正确,或者是否有更好的方法

问题2>我们是否确实无法从boost::scoped_数组中获取有效长度


谢谢

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

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

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
问题2:这是正确的,因为您无法获得传递给函数的C样式数组的长度。

我选择方法2:

vec.assign(&scpaInts[0], &scpaInts[10]);
与普通动态数组类似:

vec.assign(scpaInts.get(), scpaInts.get()+10); // => method two
int * a = new int[10];
...
vec.assign(a, a+10); // => method two
当然,方法1也可以工作,例如使用动态数组:

vec.assign(scpaInts.get(), scpaInts.get()+10); // => method two
int * a = new int[10];
...
vec.assign(a, a+10); // => method two
如您所见,方法2看起来更简单,因此更好



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

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


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

这两种方法对我来说似乎都是正确的,但第二种方法显然更清晰,因为您没有将偏移量拆分为
9
1
组件。还有两个其他选项:

vec.assign(&a[0], &a[9]+1); // => method one
或者在需要矢量之前不要创建它(所有选项中最好的):

向量向量向量(scpaInts.get(),scpaInts.get()+10);
为什么上面的代码
SCPaint[10]
是合法的?它试图访问一个边界外元素?@q0987:@q0987,@Lightness Races in Orbit:所有这些内容的摘要:C99标准说
&*
被视为不可操作,指针
ptr
&ptr[10]<代码>等同于代码> pTr+10 < /C> >,这是合法的。C++标准没有明确地表示任何这样的事情。有些人认为它“应该”是可以的,也就是说,你可以将代码>和<代码>应用到一个LValk上,因为LValk上没有对LValk进行转换,它不必是一个可访问的对象。(您可以使用非结束指针,但不能访问
scpaInts[10]
)。