gpt4 book ai didi

c++ - 如何在声明后将 NumericVector 初始化为特定大小?

转载 作者:太空狗 更新时间:2023-10-29 23:50:28 24 4
gpt4 key购买 nike

我编写了以下 Rcpp 代码,它编译但没有给出预期的结果。

    // [[Rcpp::export]]
RObject test_1 (Rcpp::NumericVector& x)
{
NumericVector x1;
if (x.size() < 5)
{
NumericVector x1(x.size()*3);
for (int ii = 0; ii < x.size(); ii++)
{
x1[ii] = sqrt(x[ii]);
}
}
else
{
NumericVector x1(x.size()*2);
for (int ii = 0; ii < x.size(); ii++)
{
x1[ii] = sqrt(x[ii]);
}
}
return x1;
}

x1,返回 vector 在 if 语句外声明,其中返回 vector x1 的大小可以变化。但是,如果我用它创建一个新对象的大小声明 NumericVector,但在空 vector 中返回 x1。

以下代码有效:

// [[Rcpp::export]]
RObject test (const Rcpp::NumericVector& x)
{
NumericVector x1;
if (x.size() < 5)
{
NumericVector tmp(x.size()*3);
for (int ii = 0; ii < x.size(); ii++)
{
tmp[ii] = sqrt(x[ii]);
}
x1 = tmp;
}
else
{
NumericVector tmp(x.size()*2);
for (int ii = 0; ii < x.size(); ii++)
{
tmp[ii] = sqrt(x[ii]);
}
x1 = tmp;
}
return x1;
}

在这里,我声明了 temp numericvector,然后将 x1 设置为该 vector 。

我不久前做过这个,并且知道有一种方法可以在声明 NumericVector 后将其设置为特定大小,但我只是不记得如何操作了。

编辑:编辑代码和问题以说明在 if 语句之前返回 vector 大小是如何未知的。

最佳答案

你可以使用这种风格:

NumericVector x;
if (foo)
x = NumericVector(1);
else
x = NumericVector(2);

或者甚至(如果你想避免生成 vector 的零初始化)

x = static_cast<NumericVector>(no_init(size));

写的时候要注意

NumericVector x;
if (foo)
NumericVector x(1);

您实际上正在创建两个 NumericVector 对象,称为x -- 一个位于顶级范围内,一个位于范围内if 语句。

也就是说,当你写的时候值得理解

NumericVector x;

您实际上是在创建一个对象,而不仅仅是声明一个对象(这仅适用于内置类型,例如 int)。因此,当您编写 NumericVector x 时,x 实际上是使用零参数 NumericVector 构造函数(它创建长度为0)

关于c++ - 如何在声明后将 NumericVector 初始化为特定大小?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30129968/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com