小编Kon*_*lph的帖子

防止临时延长其寿命?

这可能是不可能的,但我想知道是否有可能暂时不会超过其原始表达.我有一个指向父对象的对象链,以及一个将创建子对象的成员函数,这里有一个简化的例子

class person{
    string name;
    person * mommy;
public:
    person(const string & nam, person * m = 0) : name(nam), mommy(m) {}
    person baby(const string & nam){
        return person(nam, this);
    }
    void talk() const{
        if (mommy) mommy->talk();
        cout << name << endl;
    }
};

int main(){
    person("Ann").baby("Susan").baby("Wendy").talk();     // fine

    const person & babygirl = person("Julie").baby("Laura"); // not fine

    babygirl.talk();    // segfault
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我想要使​​用的方法person是将它传递给一个函数,如下所示:

void use(const person & p) {
    p.talk();
}
use(person("Anna").baby("Lisa"));
Run Code Online (Sandbox Code Playgroud)

很好.

只要没有一个临时表现在原始表达式之后,这就可以正常工作,但是如果我把一个最后的临时工具绑定到一个const引用,那么它的父母就无法生存,我得到一个段错误.我可以隐藏person复制构造函数和赋值运算符,但有什么方法可以防止这种错误发生?如果可能的话,我想避免动态分配.

c++ reference object-lifetime const-reference temporaries

8
推荐指数
1
解决办法
240
查看次数

如何实现动态大小的哈希表?

我知道哈希表数据结构的基本原理.如果我有一个大小为N的哈希表,我必须尽可能均匀地将我的数据分配到这些N桶中.

但实际上,大多数语言都有自己的内置哈希表类型.当我使用它们时,我不需要事先知道哈希表的大小.我只是把我想要的东西放进去.例如,在Ruby:

h = {}
10000000.times{ |i| h[i]=rand(10000) }
Run Code Online (Sandbox Code Playgroud)

它怎么能这样做?

hashtable data-structures

8
推荐指数
1
解决办法
1万
查看次数

在OS X上设置区域设置崩溃

以下代码在Linux上运行正常但在OS X 10.7上引发异常:

#include <iostream>
#include <locale>
#include <stdexcept>

int main() try {
    std::locale::global(std::locale(""));
    std::cout << "Using locale: " << std::locale().name() << "\n";
}
catch (std::runtime_error const& e) {
    std::cout << e.what() << "\n";
    return 1;
}
Run Code Online (Sandbox Code Playgroud)

OS X上的输出是:

locale::facet::_S_create_c_locale 名称无效

但是,标准明确地说明了这一点

该组有效的字符串参数值的是"C",""和任何实现定义的值.

所以无论什么原因导致上述行为都违反了标准.

使用的编译器是clang ++ 3.1(tags/Apple/clang-318.0.58); 我也尝试过通过Homebrew安装的GCC 4.7,结果相同.

其他人可以验证这个问题吗?是什么导致的?我做错了吗?这是OS X中的错误吗?

(也许这与另一个xlocale问题有关,但错误实际上是完全不同的.)

c++ macos locale xlocale

8
推荐指数
1
解决办法
1196
查看次数

如何在构造函数中初始化类的成员数组?

我正在尝试执行以下操作:

class sig
{
public:

int p_list[4];
}

sig :: sig()
{
p_list[4] = {A, B, C, D};
}
Run Code Online (Sandbox Code Playgroud)

我收到一个错误

缺少构造函数中的表达式.

那么我如何初始化一个数组呢?

c++

8
推荐指数
3
解决办法
3万
查看次数

如何将值与给定的对齐方式对齐

我有一个值,我想要对齐给定的对齐,即如果尚未对齐,则将值增加到对齐的下一个倍数.

在C++中执行此操作的简洁方法是什么?

例如

int x;
int alignment;
int y = ???; // align x to alignment
Run Code Online (Sandbox Code Playgroud)

c++ math

8
推荐指数
1
解决办法
4108
查看次数

如何为非包装代码设置Travis?

我想为在Github上托管的R项目设置Travis CI,这不是一个包.不幸的是,官方的R Travis支持似乎与包裹相当硬(这是公平的,有道理).

有没有机会让这个工作非包装代码,或者是我唯一的求助分支r-travis并根据我的规格进行修补?我觉得很难做到这一点很容易.

这是我失败的Travis配置:

language: R

r_github_packages:
    - klmr/modules

r_binary_packages:
    - testthat

script: make test
Run Code Online (Sandbox Code Playgroud)

此操作失败,并显示以下错误:

命令"Rscript -e 'deps <- devtools::install_deps(dependencies = TRUE);if (!all(deps %in% installed.packages())) { message("missing: ", paste(setdiff(deps, installed.packages()), collapse=", ")); q(status = 1, save = "no")}'"失败并在1期间退出.

这是有道理的:devtools::install_deps只适用于包的上下文.

我已经尝试通过添加install: true到我的配置来抑制安装步骤.但是,现在不再安装依赖项,因此构建失败了

loadNamespace(name)出错:没有名为'modules'的包

r travis-ci

8
推荐指数
1
解决办法
300
查看次数

无形地返回结果

我试图NULL通过Rcpp从C++函数中无形地返回一个结果(事实上).不幸的是我无法找到如何做到这一点.我的第一次尝试是设置,R_Visible但不再导出此全局变量; 接下来,我尝试直接调用do_invisible(调用的原语invisible),但同样地,它不会被导出(说实话,我不确定如何正确调用它).

然后我走了迂回的路,base::invisible从Rcpp通过一个叫R's Rcpp::Function.我的代码现在是这样的:

Rcpp::Function invisible = Rcpp::Environment("package:base")["invisible"];

// [[Rcpp::export]]
SEXP read_value(Rcpp::XPtr<std::vector<int>> x, int index) {
    try {
        return Rcpp::wrap(x->at(index));
    } catch (std::out_of_range const&) {
        return invisible(R_NilValue);
    }
}
Run Code Online (Sandbox Code Playgroud)

这编译并执行.不幸的是,这个invisible电话被忽略了; 当使用无效索引从R调用函数时,它会打印出来NULL.我希望它什么都不打印.

用于检测:

// [[Rcpp::export]]
Rcpp::XPtr<std::vector<int>> make_xvec() {
    return Rcpp::XPtr<std::vector<int>>{new std::vector<int>{1, 2, 3}};
}

/*** R
xv = make_xvec()
read_value(xv, 1)
invisible(read_value(xv, 4)) # Works
read_value(xv, 4)            # Doesn’t work
*/
Run Code Online (Sandbox Code Playgroud)

c++ r rcpp

8
推荐指数
1
解决办法
283
查看次数

我们如何用两行显示 F 统计量/自由度

我正在使用 Stargazer 输出包含多个 lm 模型的回归表。问题是 Stargazer 默认在一行中输出 F 统计量和自由度。如果您有 3 或 4 个模型,则意味着 Latex 中的输出不必要地宽并且延伸到页面之外。

有一个选项可以使用以下方法隐藏自由度:

stargazer(lm1,lm2,lm3,lm4, df = F)
Run Code Online (Sandbox Code Playgroud)

但是,没有办法让它显示在两行上。

这是一个可重现的不良结果示例:

lm.out.1 <- lm(stack.loss ~ Air.Flow , data=stackloss)
lm.out.2 <- lm(stack.loss ~ Water.Temp, data=stackloss)
lm.out.3 <- lm(stack.loss ~ Acid.Conc., data=stackloss)
lm.out.4 <- lm(stack.loss ~ Air.Flow + Water.Temp, data=stackloss)
lm.out.5 <- lm(stack.loss ~ Air.Flow + Water.Temp + Acid.Conc., data=stackloss)

stargazer(lm.out.1, 
          lm.out.2,
          lm.out.3,
          lm.out.4,
          lm.out.5)
Run Code Online (Sandbox Code Playgroud)

当你渲染乳胶输出时,你会得到一个不必要的宽表: 在此输入图像描述

当渲染打印时,它位于页边距之外: 在此输入图像描述

可以看到如何使用df=F选项以可打印的方式整齐有效地呈现该表:

stargazer(lm.out.1, 
          lm.out.2,
          lm.out.3,
          lm.out.4,
          lm.out.5, df = F)
Run Code Online (Sandbox Code Playgroud)

产生以下结果: 在此输入图像描述

但是,现在我们失去了有关自由度的信息。

有没有办法打印带有换行符的信息,以便它打印在表格的两行上? …

latex r linear-regression r-markdown stargazer

8
推荐指数
1
解决办法
1023
查看次数

如何从 Unix 纪元开始以毫秒为单位创建时间点?

要创建当前时间的时间点,您可以使用:std::chrono::system_clock::now()

但是,我不知道如何创建自 UNIX 纪元以来给定毫秒数的时间点?

另外,std::chrono::time_point甚至是推荐的方式来及时表示“瞬间”?还是应该std::time_t优先考虑?

c++ time c++-chrono c++17 c++20

8
推荐指数
1
解决办法
5084
查看次数

如何在 Windows 上使用 sys/socket.h?

我在 Linux 机器上使用套接字用 C 语言制作了一个服务器,它工作正常,但是当我尝试使用 Visual Studio 在 Windows 机器上运行它时,出现错误:

致命错误 C1083:无法打开包含文件:'sys/socket.h':没有这样的文件或目录

ide 告诉我找不到这个头文件。

#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
Run Code Online (Sandbox Code Playgroud)

c c++ sockets server

8
推荐指数
1
解决办法
4万
查看次数