当前位置: 首页 > 知识库问答 >
问题:

将向量转换为unique_ptr

隆向晨
2023-03-14

如何将向量转换/复制到unique_ptr ;?

这就是我想要实现的(向量源自另一个上下文,复制到unique_ptr后将被删除。unique_ptr是固定长度的,因此可以更高效地分配)。

std::vector<int> vv {1, 2, 3};

struct
    U {
        U(std::vector<int> v) { // copy constructor
            // copy vector v to unique_ptr u, HOW?
        }

        std::unique_ptr<int[]> u; 
};


U uu {vv}; // copy vector vv to unique_ptr uu, HOW?

我试图创建一个复制构造函数

U(std::vector<int> v) {
    u = std::make_unique<int[]>(v.size()); // OK
    std::copy(v.begin(), v.end(), u); // error: u has no copy constructor
}

那么,该如何构造复制构造函数呢?

实际上而且更重要的是,一旦构造好了,我想要unique_ptr ;在长度和内容上都是恒定的,所以在我的情况下应该是

std::unique_ptr<int const[]> const u; // const in both length and content

在这两种情况下,复制构造函数看起来如何?

案例1)std::unique_ptr u案例2)std::unique_ptr const u

共有3个答案

边银龙
2023-03-14

你正在做的事情有几个问题。首先,您有两个副本而不是一个(在U构造函数中),然后,您需要在U上获取实际的迭代器,而不是U本身。

为了保证常量的正确性,您可以只使用一个中间的唯一指针,允许更改数据。

最后的代码应该如下所示:

struct U {
    U(const std::vector<int>& v) {
        auto data = std::make_unique<int[]>(v.size());
        std::copy(v.begin(), v.end(), data.get());
        u = std::move(data);
    }

    std::unique_ptr<int const[]> u; 
};

注意:一个矢量和你唯一的指针一样有效。数据访问模式将是相同的。开销仅在push_back或擦除时才存在。因为您没有执行这些操作,所以只需存储一个常量向量

如果您想要常量std::unique_ptr ;u ,那么您需要添加一个static方法,该方法将向量转换为std::unique_ptr ,并且您的构造函数将在其上获取一个&,并将其移动到init列表中的u中。

struct U {
    U(std::unique_ptr<int const[]>&& u)
    : u(std::move(u)) {}

    static U create(const std::vector<int>& v) {
        auto data = std::make_unique<int[]>(v.size());
        std::copy(v.begin(), v.end(), data.get());
        std::unique_ptr<int const[]> u = std::move(data);
        return U(std::move(u));
    }

    const std::unique_ptr<int const[]> u; 
};
斜成济
2023-03-14

我看不出有什么原因,但下面是你如何做到这一点的

struct U {
    U(const std::vector<int>& v) : u{std::make_unique<int[]>(v.size())}{
        std::copy(v.cbegin(), v.cend(), u.get());
    }
    

    std::unique_ptr<int[]> u;
};
int main(){
    std::vector<int> vv {1, 2, 3};
    U uu {vv}; // copy vector vv to unique_ptr uu, HOW?
    std::for_each(uu.u.get(), uu.u.get()+3, [](auto el){std::cout << el << " ";});

}

演示

殷宾白
2023-03-14

我试图创建一个复制构造函数

那不是复制构造函数。这是一个转换构造函数。

std::copy(v.begin(), v.end(), u); // error: u has no copy constructor

std::copy的第三个参数必须与前两个参数一样是迭代器std::unique_ptr不是迭代器。

唯一指针指向数组。指针是数组的迭代器。所以,你需要的是一个指针。如何从唯一指针中获取指针?使用std::unique_ptr::get成员函数。

通过接受模板迭代器(或范围)而不是向量,可以使构造函数更加通用。另外,您可以避免复制两次(使用引用也可以避免)。

unique_ptr具有固定长度,因此可以更有效地分配

在如何分配向量和动态数组(例如由唯一指针管理的数组)方面几乎没有什么区别。即使存在一些差异,复制输入向量进行转换也比不复制效率低得多。

 类似资料:
  • 我是Spark和Scala的新手,我正在尝试阅读它在MLlib上的文档。 关于 http://spark.apache.org/docs/1.4.0/mllib-data-types.html 的教程, 不显示如何从本地向量列表构造RDD[Vector](可变行)。 例如,我已经在火花壳中执行(作为我探索的一部分) 如果“合并”,它将看起来像这个矩阵 那么,如何将矢量 、 转换为?

  • 问题内容: 假设我有一个形状为(1,256)的行向量。我想将其转换为形状为(256,1)的列向量。您在Numpy中会如何做? 问题答案: 您可以使用 转置 操作来执行此操作: 例: 请注意,原始数组仍将保持不变。转置操作只会复制并转置它。 如果输入阵列是相当1D中,则可以 促进 通过引入新的(singleton)的轴作为所述第二尺寸数组的列向量。下面是一个示例: 对于一维情况,还有另一个选择是使用

  • 问题内容: 将Object数组转换为Vector的最佳方法是什么? JDE <1.5 this.elements是一个Object [] 谢谢,雷特 我应该澄清我的问题 我的目标平台是黑莓。 不支持收藏。Array.asList()也不是:// 全班 问题答案: 现在,好像您要复制两次数据,但实际上并非如此。您确实得到了一个小的临时对象(来自的),但这提供了阵列的视图。而不是复制它,读和写操作将遍

  • 我在C++中创建了一个将数字转换为数组的函数。由于这一创建,我还创建了将数组转换回数字的相反部分: 问题就在这里。当我在main中使用以下代码运行时: 我得到了240000,而我应该得到235626。我找了很久都找不到代码中的逻辑错误。有人知道怎么回事吗?

  • 问题内容: 我正在使用Java本机功能- 在C ++中,我的本机函数- 我的问题是如何将resultList(向量类型)转换为jobject类型? 问题答案: 您必须在C ++中为ArrayList创建包装器。就像是: 有关更多信息,请参见: http://download.oracle.com/javase/1.4.2/docs/guide/jni/spec/functions.html

  • 有没有办法将数据帧转换为向量?例如 预期产出

  • 我有一个整数向量: 考虑到将始终为偶数。 我只是想把相邻的元素转换成一对,像这样: i、 两个相邻的元件连接成一对。 我可以使用什么STL算法轻松实现这一点?有没有可能通过一些标准算法来实现这一点? 当然,我可以很容易地编写一个旧的索引for循环来实现这一点。但我想知道,使用基于范围的for循环或任何其他STL算法(如等)最简单的解决方案是什么样的。

  • 我正在进行spring webflux文件上传。我想从控制器上传文件到amazon S3 bucket上。在控制器中,我收到了以下物体 从文件部分。content()我可以 我的问题是如何转换这个通量