小编Ram*_*ama的帖子

std :: random_device的线程安全性

我有一些看起来有点像这样的代码:

std::random_device rd;

#pragma omp parallel
{
    std::mt19937 gen(rd());
    #pragma omp for
    for(int i=0; i < N; i++)
    {
        /* Do stuff with random numbers from gen() */
    }
}
Run Code Online (Sandbox Code Playgroud)

我有几个问题:

  • std::random_device线程安全的?也就是说当几个线程立刻调用它时,它会做一些无用的事情吗?
  • 这通常是个好主意吗?我应该担心重叠的随机数流吗?
  • 有没有更好的方法来实现我想要的(每个线程中的独立随机数流 - 我现在不太担心可重复性)?

如果它对std::random_device我主要在Windows上运行的工作有任何影响,尽管我希望代码在Linux和OSX上同样运行良好.

c++ random openmp c++11

17
推荐指数
1
解决办法
1780
查看次数

QSslSocket:无法调用未解析的函数

我使用Qt Creator 4.2.0运行Qt 5.7.1(MSVC 2015,32位).我有问题QSslSocket.我收到以下错误:

qt.network.ssl: QSslSocket: cannot call unresolved function SSLv23_client_method
qt.network.ssl: QSslSocket: cannot call unresolved function SSL_CTX_new
qt.network.ssl: QSslSocket: cannot call unresolved function SSL_library_init
qt.network.ssl: QSslSocket: cannot call unresolved function ERR_get_error
qt.network.ssl: QSslSocket: cannot call unresolved function ERR_get_error
Run Code Online (Sandbox Code Playgroud)

我去了以下位置openssl github并下载了zip文件.我已将"libeay32.dll"和"ssleay32.dll"文件移到我的发布目录中,我仍然遇到这些错误.有没有人QSslSocket能够让我的步骤让套接字工作或有任何建议?

c++ qt qsslsocket

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

在C++中等效的LinkedHashmap?

我有一个Java程序,我想将其转换为C++.因此,LinkedhashmapJava代码中使用了一种数据结构,我想将其转换为C++.LinkedHashmapC++中是否有等效的数据类型?

我尝试使用std::unordered_map它,但它不保持插入的顺序.

c++ unordered-map linkedhashmap

10
推荐指数
1
解决办法
5110
查看次数

boost :: thread - 简单示例不起作用(C++)

为了开始boost::thread,我写了一个非常简单的例子 - 它不起作用.有谁可以指出我的错误?

我写了一个非常简单的仿函数类来完成这项工作.它应该计算一个std::vector双精度的总和,并给我一个方法来获得后来的结果:

class SumWorker
{
private:
    double _sum;
public:

    SumWorker() : _sum(-1.0) {}

    void operator() (std::vector<double> const & arr)
    {
        _sum = 0.0;
        for(std::vector<double>::const_iterator i = arr.begin();
            i != arr.end();
            i++)
        {
            _sum += (*i);
        }
    }

    double const value() const
    {
        return _sum;
    }
};
Run Code Online (Sandbox Code Playgroud)

现在,我可以通过两种方式之一计算总和.如果我在主线程中这样做,比如,

SumWorker S;
S(numbers);              // "numbers" is an std::vector<double>
double sum = S.value();  // "sum" now contains the sum
Run Code Online (Sandbox Code Playgroud)

一切正常.但是,如果我尝试在一个单独的线程中执行此操作(这是重点),

SumWorker S;
boost::thread thread(S, numbers); // Should be …
Run Code Online (Sandbox Code Playgroud)

c++ boost-thread

9
推荐指数
2
解决办法
484
查看次数

"="运算符返回什么?

据我所知,C++从左到右工作.例如,如果我这样做:

std::cout << "output" << "stream";
Run Code Online (Sandbox Code Playgroud)

C++首先从最左边的东西(std :: cout)开始,然后是<<运算符,它取右边的字符串文字("输出")并将它放到运算符左边的对象(std :: COUT).然后C++返回运算符左侧的对象(std :: cout),然后继续代码,另一个<<运算符.

"="运算符返回什么?

如果我做

double wage = 5;
double salary = wage = 9999.99;
Run Code Online (Sandbox Code Playgroud)

我认为"="运算符只返回"="的左或右操作数.因此,根据我的逻辑,在工资初始化的行中,工资用工资值初始化,然后"="运算符返回工资或工资(比如工资),然后它将9999.99分配给工资,但工资是走了,应该保持5的价值.

但是当我在"工资"初始化之后检查"薪水"和"工资"的值时,两者的值都是9999.99.如果我应用与上面使用std :: cout相同的逻辑,那么应该只有一个变量,"salary"或"wage",值为9999.99

c++

7
推荐指数
1
解决办法
1867
查看次数

在c ++中使用牛顿二项式系数的问题

我的牛顿二项式系数程序存在问题.首先它打印负数,但改变阶乘函数类型unsigned long long似乎已经解决了打印负数的问题.该程序适用于max n = 20,在它上面开始打印零,一和二.不知道如何解决这个问题,希望有人可以帮我一臂之力.

#include <iostream>
using namespace std;

unsigned long long factorial(int n) {
    if (n == 0) {
        return 1;
    }
    return n*factorial(n - 1);
}

void Binom(int n ,int k) {
    unsigned long long factorialResult;
    if (k > n) {
        return;
    }
    factorialResult = factorial(n) /(factorial(k) * factorial(n - k));
    cout << factorialResult << " ";
    if (n >= k) {
        Binom(n, k + 1);
    }
}
Run Code Online (Sandbox Code Playgroud)

c++

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

LoadLibrary 失败:%1 不是有效的 Win32 应用程序。在R中

我有一个通过 R 为我的项目加载的 C 代码。使用 dyn.load,我能够在 Windows 64 位计算机和 Linux 服务器中加载 C 代码。但是,当我尝试在 Windows 32 位计算机中加载 .dll 时,出现以下错误。

使用 dyn.load 时出现 R 错误

我尝试使用整个路径,从工作目录运行 dyn.load 命令,但它们都不起作用。我的R版本: R版本

另外,我还编辑了系统变量,您可以在下面找到系统变量。

`C:\ProgramData\Oracle\Java\javapath;
%SystemRoot%\system32;
%SystemRoot%;
%SystemRoot%\System32\Wbem;
%SYSTEMROOT%\System32\WindowsPowerShell\v1.0\;
C:\Program Files\Common Files\Roxio Shared\DLLShared\;
C:\Program Files\Common Files\Roxio Shared\10.0\Roxio Central36;
C:\Program Files\Windows Imaging\;
C:\Program Files\QuickTime\QTSystem\;
C:\Program Files\R\R-3.3.2\bin;
C:\Rtools\bin;
C:\Rtools\mingw_32\bin;
C:\Rtools\mingw_32\lib\gcc\i686-w64-mingw32\4.9.3;
C:\Users\******\Documents\R\R-3.3.2\library\Rcpp`
Run Code Online (Sandbox Code Playgroud)

针对此类问题的现有解决方案对我没有帮助。

如果有人能帮助我解决这个问题,那就太好了。

c c++ r

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

使用迭代器查找向量的中间元素 - C++

我有两个问题.

第一个问题

我读关于迭代器C++C++ primer 5th edition书.在本书的一个代码示例中,给出了以下代码片段将在向量中找到中间元素vi

auto mid = vi.begin() + vi.size() / 2; 
Run Code Online (Sandbox Code Playgroud)

现在我想问一下,为什么vi.begin()加入vi.size()?会不会vi.size()/2有足够找到矢量中间元素vi

第二个问题

auto mid = vi.begin() + vi.size() / 2;
Run Code Online (Sandbox Code Playgroud)

在此代码段中,如果我vi.begin() + vi.size()像这样添加括号:

auto mid = (vi.begin() + vi.size()) / 2;
Run Code Online (Sandbox Code Playgroud)

它抛出错误 no "/" operator matches these operands...

为什么会抛出这个错误?我问这个是因为逻辑上这个表达式vi.begin() + vi.size()应该首先计算,结果应该除以2.

如果我错了,请纠正我.

c++ iterator vector

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

两次溢出?

我一直想知道万一double达到最大值,会发生什么,所以我决定编写以下代码:

#include <stdint.h>
#include <iostream>
#define UINT64_SIZE 18446744073709551615
int main() {
    std::uint64_t i = UINT64_SIZE;
    double d1 = ((double)(i+1)) / UINT64_SIZE; 
    double d2 = (((double)(i)) / UINT64_SIZE)*16;
    double d3 = ((double)(i * 16)) / UINT64_SIZE;

    std::cout << d1 << " " << d2 << " " << d3; 
}
Run Code Online (Sandbox Code Playgroud)

我期待这样的事情:

0 16 0 
Run Code Online (Sandbox Code Playgroud)

但这是我的输出:

0 16 1 
Run Code Online (Sandbox Code Playgroud)

这里发生了什么?为什么值d3d1不同?

编辑:

我决定将代码更改为此,以查看结果:

#include <stdint.h>
#include <iostream>
#define UINT64_SIZE 18446744073709551615
int main() {
    std::uint64_t i = UINT64_SIZE; …
Run Code Online (Sandbox Code Playgroud)

c++ overflow

5
推荐指数
1
解决办法
6311
查看次数

C ++数组副本显示vc ++中的错误

int a[4] = {10,20,30,40};
std::vector<int> vec(4);
std::copy(a, a + 4, vec.begin());
Run Code Online (Sandbox Code Playgroud)

我在vc ++中遇到以下错误,它显示警告,但标记为错误,我该如何解决?

严重性代码说明项目文件行抑制状态错误C4996 std::copy::_Unchecked_iterators::_Deprecatestd::copy使用可能不安全的参数进行调用-此调用依赖于调用者检查传递的值是否正确。要禁用此警告,请使用-D_SCL_SECURE_NO_WARNINGS。请参阅有关如何使用Visual C ++“检查的迭代器” ConsoleApplication3的文档:e:\ programs \ vc \ include \ xutility 2372

c++ copy visual-c++

5
推荐指数
1
解决办法
5521
查看次数