【问题标题】:How to copy data from `boost::scoped_array` to `std::vector`如何将数据从`boost::scoped_array`复制到`std::vector`
【发布时间】:2012-10-26 14:38:47
【问题描述】:
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 获取有效长度?

谢谢

【问题讨论】:

    标签: c++ boost stl std


    【解决方案1】:

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

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

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

    【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      我会选择方法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() 方法。

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

          【解决方案5】:

          这两种方法对我来说似乎都是正确的,但第二种方法肯定更清楚,因为您没有将偏移量拆分为 91 组件。还有其他两种选择:

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

          或者在需要之前不要创建向量(所有选项中最好的):

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

          【讨论】:

            猜你喜欢
            • 2014-01-11
            • 2018-07-24
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-01-06
            • 2011-02-23
            • 2011-05-19
            相关资源
            最近更新 更多