如何将向量转换/复制为唯一的\u 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::唯一性
我试图复制一个构造器
这不是复制构造函数。这是一个转换构造函数。
std::copy(v.begin(), v.end(), u); // error: u has no copy constructor
std::copy
的第三个参数必须是迭代器,就像前两个一样。std::unique_ptr
不是迭代器。
唯一指针指向一个数组。指针是数组的迭代器。所以,你需要的是一个指针。如何从唯一指针获取指针?使用std::unique_ptr::get
成员函数。
通过接受模板迭代器(或范围)而不是向量,可以使构造函数更通用。作为奖励,你可以避免复制两次(这也可以通过使用引用来避免)。
unique_ptr长度固定,因此可以更有效地分配
向量和动态数组(例如由唯一指针管理的数组)的分配方式几乎没有区别。即使存在一些差异,复制输入向量进行转换的效率也比不复制要低得多。
你正在做的事情有几个问题。首先你有两个副本而不是一个(在U
构造函数中),然后因为你需要在你的u
上得到实际的迭代器,而不是u
本身。
对于const正确性,您可以只有一个中间唯一指针,允许更改数据。
您拥有的最终代码应该如下所示:
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;
};
注意:向量的效率与唯一指针的效率一样。数据访问模式将是相同的。只有当你将_推回它,或将其删除时,才会产生开销。由于您不需要执行这些操作,只需存储一个常量向量
。
如果你想要一个constd::unique_ptr
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;
};
我在C++中创建了一个将数字转换为数组的函数。由于这一创建,我还创建了将数组转换回数字的相反部分: 问题就在这里。当我在main中使用以下代码运行时: 我得到了240000,而我应该得到235626。我找了很久都找不到代码中的逻辑错误。有人知道怎么回事吗?
问题内容: 将Object数组转换为Vector的最佳方法是什么? JDE <1.5 this.elements是一个Object [] 谢谢,雷特 我应该澄清我的问题 我的目标平台是黑莓。 不支持收藏。Array.asList()也不是:// 全班 问题答案: 现在,好像您要复制两次数据,但实际上并非如此。您确实得到了一个小的临时对象(来自的),但这提供了阵列的视图。而不是复制它,读和写操作将遍
我是Spark和Scala的新手,我正在尝试阅读它在MLlib上的文档。 关于 http://spark.apache.org/docs/1.4.0/mllib-data-types.html 的教程, 不显示如何从本地向量列表构造RDD[Vector](可变行)。 例如,我已经在火花壳中执行(作为我探索的一部分) 如果“合并”,它将看起来像这个矩阵 那么,如何将矢量 、 转换为?
有没有办法将数据帧转换为向量?例如 预期产出
问题内容: 假设我有一个形状为(1,256)的行向量。我想将其转换为形状为(256,1)的列向量。您在Numpy中会如何做? 问题答案: 您可以使用 转置 操作来执行此操作: 例: 请注意,原始数组仍将保持不变。转置操作只会复制并转置它。 如果输入阵列是相当1D中,则可以 促进 通过引入新的(singleton)的轴作为所述第二尺寸数组的列向量。下面是一个示例: 对于一维情况,还有另一个选择是使用
当使用来自外部库的函数时,“任意”取消引用指向const引用的指针是否安全? 这样做是否普遍安全/明智 更重要的是,除了C语言中“不赞成”的原始指针之外,使用常量指针真的有充分的理由这样做吗?