小编Kon*_*lph的帖子

什么是有条件地控制for循环方向的最佳方法

我的代码中有一个块,其中for循环应该根据条件向前或向后运行.

if (forwards) {
    for (unsigned x = 0; x < something.size(); x++ ) {
        // Lots of code
    }

} else {
    for (unsigned x = something.size()-1 ; x >= 0 ; x-- ) {
        // Lots of code
    }
} 
Run Code Online (Sandbox Code Playgroud)

有没有一个很好的方法来设置它,所以我不重复两次for循环中的所有代码?

有问题的'东西'是std :: vector <>,所以也许它可以用迭代器?(我没有使用C++ 11)

c++ iterator loops

6
推荐指数
3
解决办法
1594
查看次数

Windows中的多个shell命令

我正在尝试在R中复制一个shell命令,并且无法弄清楚如何将命令串在一起.这只返回工作文件夹的内容(system()由于某种原因失败):

> shell("dir")
 Volume info ..
 Directory of E:\Documents\R
 contents are listed..
Run Code Online (Sandbox Code Playgroud)

现在让我们尝试导航到C盘并运行dir(不使用明显的dir C:)..

> shell("cd C:")
C:\
> shell("dir")
 Volume in drive E is GT
 etc..
Run Code Online (Sandbox Code Playgroud)

所以似乎命令不能单独输入,因为shell不记得工作目录.所以..

> (cmd = "cd C:
+ dir")
[1] "cd C:\ndir"
> shell(cmd)
C:\
Run Code Online (Sandbox Code Playgroud)

没有运气,因为没有报告C:文件夹.我尝试过的其他方法也失败了.感谢任何想法.

r

6
推荐指数
2
解决办法
983
查看次数

const成员函数的重载决策C++

假设您有一个具有两个成员函数的类T.

  1. char foo() const {...}
  2. char foo() {...}.

我的理解是,当要求一个常数T时,我们决定(1); 对于非常数T,我们决定(2). 

  1. 那是对的吗?   
  2. 在这个决议中调用哪个规则?(参考标准很棒,但有用的简要总结表示赞赏) 

笔记:

  1. 我试图谷歌为它,但我得到的旧命中是其他重载决议涉及const的情况.然而,链接到一个老SO实际上解释上面显然很棒.     

  2. 当重新阅读Stroustrup的"The C++编程语言",第2版("特别版"),第11.12节中的String/Cref示例时,就出现了这一点.296.由于Stroustrup是如此精确,答案可能在前几节,但我没有看到在哪里.参考Stroustrup中的部分也非常受欢迎(第2版最好,因为这是我所拥有的).第10.2.6节将const成员引入为"不改变对象值的那些",这暗示了答案,但并没有将我作为明确的解决方案指令.

c++ overloading class

6
推荐指数
1
解决办法
371
查看次数

使用mkstemp()创建的文件被删除?

我有一个调用mkstemp()的程序,写了一些返回fd的东西,然后关闭fd.我希望文件保留,直到我自己删除它!使用rm命令等等.我的问题是:Linux会在关闭后删除此文件(fd)吗?

c linux temporary-files

6
推荐指数
1
解决办法
2829
查看次数

ioslides中标题和绘图之间的空白

我正在使用 ioslides 的默认主题进行演示,但在幻灯片上安排绘图时遇到困难。

我对相应的幻灯片使用以下代码:

```{r crint1, fig.width = 7, fig.height = 5.5, fig.retina = NULL, fig.align="center"}
options(warn=-1)
load("path_to_data.RData")
ord <- order(cor.table$COR)
barplot(cor.table$COR[ord], names.arg=cor.table$group[ord],horiz=T
        , cex.name=.6, border=F, space=.3, col="gray30", 
        xlab="Correlation Coefficient", las=1)
  grid(NULL, NA, col="white", lty="solid", lwd=0.7)
    abline(v=mean(cor.table$COR), lwd=2, lty=2, col="red")
      text(mean(cor.table$COR), 1, "Average", cex=.8, col="red", pos=4)```
Run Code Online (Sandbox Code Playgroud)

结果如下:

图片链接

没关系,但我希望情节从标题正下方开始并在幻灯片上扩展更多,因此行的名称是可读的并且不会重叠。

我尝试使用fig.heightfig.width,但它们只会扩展绘图的大小而不会更改起始坐标(这会使绘图超出幻灯片)。

有什么方法可以减少标题下方的空白区域并使用该边距来扩展绘图?我假设我必须编辑该特定幻灯片的 CSS,我只是不确定如何。任何帮助表示赞赏。

markdown r ioslides

6
推荐指数
1
解决办法
2418
查看次数

Clang在未评估的上下文中抱怨未定义的constexpr函数

我正在使用一个简单的SFINAE技巧来检查成员函数是否存在,如下所示:

#include <type_traits>

template <typename C>
struct has_size {
    template <typename T>
    static constexpr auto check(T*) ->
        decltype(std::declval<T const>().size(), std::true_type{});

    template <typename>
    static constexpr auto check(...) -> std::false_type;

    static constexpr bool value = decltype(check<C>(nullptr))::value;
};

// Usage:
static_assert(has_size<std::vector<int>>::value, "std::vector<int> has size()");
Run Code Online (Sandbox Code Playgroud)

(我知道现在有一种更简单的方法,但是当我编写这段代码时却没有回来.)

此代码适用于GCC.然而,Clang发出警告1(Apple LLVM 7.3以上的所有版本,无论哪个是上游版本):

decltype.cpp:15:27: error: inline function 'has_size<std::__1::vector<int, std::__1::allocator<int> > >::check<std::__1::vector<int, std::__1::allocator<int> > >' is not defined [-Werror,-Wundefined-inline]
    static constexpr auto check(T*) ->
                      ^
decltype.cpp:22:44: note: used here
    static constexpr bool value = decltype(check<C>(nullptr))::value; …
Run Code Online (Sandbox Code Playgroud)

c++ constexpr clang++

6
推荐指数
1
解决办法
344
查看次数

从对向量中按值擦除元素

C ++ 20开始,我们可以通过执行以下操作从向量中按值删除元素:

std::vector<int> v = {10,20,30,40,50};
std::erase(v,30);
Run Code Online (Sandbox Code Playgroud)

那真的很方便,更不用说了std::erase_if

但是,如果我们有一个成对的向量并且要擦除,仅当成对的second值匹配时该怎么办?

std::pair<int, std::string> foo = std::make_pair(1,"1");
std::pair<int, std::string> foo2 = std::make_pair(2,"2");

std::vector< std::pair<int, std::string> > v;
v.push_back(foo);
v.push_back(foo2);

std::erase(v, make_pair(1,"2"));    //This is not going to work!
Run Code Online (Sandbox Code Playgroud)

那么,有没有一种方法可以通过second向量对中的值擦除元素?

c++ vector c++20

6
推荐指数
1
解决办法
93
查看次数

反序列化消息而不将整个文件加载到内存中?

我正在使用 Google Protocol Buffers 和 Python 来解码一些大数据文件——每个文件 200MB。我下面有一些代码展示了如何解码分隔流,它工作得很好。然而,它使用read()将整个文件加载到内存中然后迭代它的命令。

import feed_pb2 as sfeed
import sys
from google.protobuf.internal.encoder import _VarintBytes
from google.protobuf.internal.decoder import _DecodeVarint32

with open('/home/working/data/feed.pb', 'rb') as f:
    buf = f.read() ## PROBLEM-LOADS ENTIRE FILE TO MEMORY.
    n = 0
    while n < len(buf):
        msg_len, new_pos = _DecodeVarint32(buf, n)
        n = new_pos
        msg_buf = buf[n:n+msg_len]
        n += msg_len
        read_row = sfeed.standard_feed()
        read_row.ParseFromString(msg_buf)
        # do something with read_metric
        print(read_row)
Run Code Online (Sandbox Code Playgroud)

请注意,此代码来自另一篇 SO 帖子,但我不记得确切的网址。我想知道是否有readlines()协议缓冲区的等效项允许我一次读取一条分隔消息并对其进行解码?我基本上想要一个不受 RAM 限制的管道,我必须加载文件。

似乎有一个pystream-protobuf包支持其中一些功能,但它已经有一两年没有更新了。7年前的帖子也问过类似的问题。但我想知道从那以后是否有任何新信息。

从流中读取多个 …

python protocol-buffers

6
推荐指数
1
解决办法
1617
查看次数

如何正确运行 2 个同时等待事物的线程?

基本上,我有 2 个线程,接收和发送。我希望能够输入一条消息,每当我收到一条新消息时,它就会“打印在我正在输入的行上方”。首先我认为会起作用,您可以粘贴它,它将运行:

import multiprocessing
import time
from reprint import output
import time
import random
import sys

def receiveThread(queue):
    i = 0
    while True:
        queue.put(i)
        i+=1
        time.sleep(0.5)

def sendThread(queue):
    while True:
        a = sys.stdin.read(1)
        if (a != ""):
            queue.put(a)
        


if __name__ == "__main__":
    send_queue = multiprocessing.Queue()
    receive_queue = multiprocessing.Queue()

    send_thread = multiprocessing.Process(target=sendThread, args=[send_queue],)
    receive_thread = multiprocessing.Process(target=receiveThread, args=[receive_queue],)
    receive_thread.start()
    send_thread.start()

    with output(initial_len=2, interval=0) as output_lines:
        while True:
            output_lines[0] = "Received:  {}".format(str(receive_queue.get()))
            output_lines[1] = "Last Sent: {}".format(str(send_queue.get()))
Run Code Online (Sandbox Code Playgroud)

但是这里发生的是我无法发送数据。与我 put 时不同,输入不会给我一个 EOF a …

python input command-line-interface python-multiprocessing

6
推荐指数
1
解决办法
1180
查看次数

renv 和 git:提交什么

我试图让我和我的同事开始使用 renv。我发现了关于应该/可以提交给 git 进行协作的不同信息:

  1. Renv合作小插图建议不仅要承诺renv.lock,而且还要.RProfile承诺renv/activate.R
  2. 然而,可以只提交renv.lock

显然,开发人员也就使用哪种策略进行了一些讨论。

一般来说(来自 pyhton,基本上 arequirements.txt就足够了),我非常喜欢方法 2。它有什么缺点吗?合作者必须做的事情有什么变化(例如以renv::restore或开头renv::init)?

git r renv

6
推荐指数
1
解决办法
583
查看次数