小编Mar*_*dik的帖子

什么是C++ 11随机分布?

我正在尝试实现以下类:

typedef std::mt19937 Engine;

class Interval 
{
public:
    double upperBoundary;
    double lowerBoundary;
    double generateUniformRandomNumber(Engine& engine);
};
Run Code Online (Sandbox Code Playgroud)

我希望这个类在多线程环境中工作.每个线程都有自己的Engine对象实例,它将传递Engine给具有随机行为的任何类的对象.

为了统一生成C++ 11方式的随机数,the的实现generateUniformRandomNumber必须是这样的:

uniform_real_distribution<double> distribution_; // private member of Interval

double Interval::generateUniformRandomNumber(Engine& engine)
{
    return distribution_(engine); 
}
Run Code Online (Sandbox Code Playgroud)

问题是我不理解C++ 11发行版.我知道C++ 11随机数引擎可以是非常大的对象(几千字节),但是分布呢?起初我认为发行版只是简单的仿函数,它operator()是一个pure const函数,但似乎它既不是pure也不是const.根据该参考,每个分发实例具有reset()成员函数.这意味着它有一个潜在的大内部状态或缓存.

我的问题是:

  1. 分配是否具有内部状态?如果是,为什么?标准是否说明了这个州的规模?

  2. 像我一样做一个实现是一个好主意吗?有没有更好的办法?

c++ random c++11

8
推荐指数
2
解决办法
584
查看次数

如何使用隐式虚拟析构函数正确解析不兼容的throw说明符?

此代码无法编译:

#include <QString>

/* relevant part:
struct QString 
{
  ~QString() noexcept(false) {};
};
*/

class Base
{
public:
    virtual ~Base() = default;
};

class Derived : public Base
{
    QString string_;
};

int main()
{
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

错误是:

error: looser throw specifier for 'virtual Derived::~Derived()'
error:   overriding 'virtual Base::~Base() noexcept (true)'
Run Code Online (Sandbox Code Playgroud)

我没有使用异常的经验,但我认为问题是QString析构函数没有异常说明符,因此隐式创建的Derived::~Derived也没有异常说明符.这是隐含的不兼容Base::~Basenoexcept(true).

如果我QString用类noexcept(true)(例如std::string)排除或替换它,代码将编译.

起初我认为我可以通过将两个析构函数声明为noexcept(false):

virtual ~Base() noexcept(false) = default;
virtual ~Derived() noexcept(false) = …
Run Code Online (Sandbox Code Playgroud)

c++ exception c++11

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

为什么qmake在这种情况下会添加-O1和-O2优化标志?

我试图使用qmake .pro文件将优化标志传递给gcc:

hello.pro:

TEMPLATE = app
CONFIG += console
CONFIG -= app_bundle
CONFIG -= qt

SOURCES += main.cpp

QMAKE_CXXFLAGS += -O3 \
Run Code Online (Sandbox Code Playgroud)

main.cpp中:

#include <iostream>

int main()
{
    std::cout << "Hi!" << std::endl;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

编译输出:

15:14:34:为项目运行步骤TestGrounds ...
15:14:34:开始:
"/ usr/bin/make"clean rm -f main.o
rm -f*~core*.core
15:14: 34:进程"/ usr/bin/make"正常退出.
15:14:34:配置不变,跳过qmake步骤.
15:14:34:开始:"/ usr/bin/make"
g ++ -c -pipe -O3 -O2 -Wall -W -fPIE -I/opt/Qt5.2.0/5.2.0/gcc/mkspecs/linux- g ++ -I ../../ Projects/TestGrounds -I.-o main.o ../../Projects/TestGrounds/main.cpp
克++ -Wl,-O1 -Wl,-rpath,/选择/ Qt5.2.0/5.2.0/GCC …

c++ gcc qmake

8
推荐指数
2
解决办法
6570
查看次数

在构建gcc-4.8.2时如何理解这些可怕的错误?

我试图在远程Debian 7系统上安装gcc-4.8.2编译器,我没有root权限,但只有ssh访问权限.我发现最简单的方法是从源代码编译编译器.

我正在从GCC网页上关注这个简短的安装手册.

基本上我做了最简单的安装,总结在页面底部:

tar xzf gcc-4.8.2.tar.gz
cd gcc-4.8.2
./contrib/download_prerequisites
cd ..
mkdir objdir
cd objdir
$PWD/../gcc-4.8.2/configure --prefix=$HOME/gcc-4.8.2 --enable-languages=c++
make
Run Code Online (Sandbox Code Playgroud)

除了./contrib/download_prerequisites防火墙限制,我没有在远程计算机上运行脚本.相反,我在我的本地机器上运行它,然后将整个文件夹压缩回来gcc-4.8.2.tar.gz并将其scp到远程机器.在那里,我重新创建了前提库(gmp,...)的符号链接并运行make.几秒钟后,我收到了不可思议的错误:

In file included from ./tm.h:19:0,
                 from ../../gcc-4.8.2/gcc/c/c-lang.c:24:
./options.h:4078:2: error: #error too many masks for ix86_isa_flags
In file included from ../../gcc-4.8.2/gcc/tree.h:26:0,
                 from ../../gcc-4.8.2/gcc/c/c-lang.c:25:
../../gcc-4.8.2/gcc/statistics.h:25:2: error: #error GATHER_STATISTICS must be defined
In file included from ../../gcc-4.8.2/gcc/system.h:268:0,
                 from ../../gcc-4.8.2/gcc/c/c-lang.c:22:
../../gcc-4.8.2/gcc/hwint.h:16:39: …
Run Code Online (Sandbox Code Playgroud)

c++ linux installation gcc

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

为什么订阅工作和阻止不在Spring的反应性Mongo中?

我选择了,和,创建了一个Spring Springizr的新项目.KotlinGradleM7Web-reactive

我做了一个小项目:

data class Person (val id: String)

@Component class PersonHandler(val template: ReactiveMongoTemplate) 
{
    init
    {
        println("Initializing")

        val jim: Mono<Person> =  template.save(Person("Jim"))
        val john: Mono<Person> = template.save(Person("John"))
        val jack: Mono<Person> = template.save(Person("Jack"))

        launch(jim)
        launch(john)
        launch(jack)

        println("Finished Initializing")
    }

    fun launch(mono: Mono<Person>)
    {
        mono.subscribe({println(it.id)}, {println("Error")}) // This works
        // mono.block()  This just hangs
    } 
}
Run Code Online (Sandbox Code Playgroud)

我尝试将三个人保存到数据库中.该save方法只返回Mono需要执行的操作.如果我尝试通过简单的订阅来执行它,一切都很好:

Initializing
Finished Initializing
2017-12-21 13:14:39.513  INFO 17278 --- [      Thread-13] org.mongodb.driver.connection            : Opened connection …
Run Code Online (Sandbox Code Playgroud)

mongodb spring-data-mongodb spring-boot project-reactor spring-webflux

8
推荐指数
2
解决办法
2467
查看次数

什么类型的随机数引擎与指定的随机分布一起使用?

C++ 11生成随机数的方法是:

  1. 实例化随机数引擎
  2. 实例化随机分布
  3. 通过分布推送引擎中的随机数

问题在于,随机数引擎随机分布都是根据您使用的算法类型进行模板化的.

这两种类型的算术如何相关?

你能为引擎使用32位整数吗?对于分布使用64位整数并且相反?有什么危险?浮点类型怎么样?

我假设一个指导原则,即引擎生成的可能数字的数量应该大于或等于您希望得到的不同随机数的数量.不幸的是,我无法测试我的假设,因为在我的计算机上uint_fast32_t并且uint_fast64_t是相同的,因此两个C++ 11生成器中的每一个的建议引擎都产生相同的结果.

有关std :: uniform_real_distributionstd :: uniform_int_distribution等C++ 11发行版的文档在这方面不完整:

本节不完整.原因:对发电机的要求

但是,例如,gcc 4.7实施uniform_real_distribution是:

  template<typename _UniformRandomNumberGenerator>
result_type
operator()(_UniformRandomNumberGenerator& __urng,
       const param_type& __p)
{
  __detail::_Adaptor<_UniformRandomNumberGenerator, result_type>
    __aurng(__urng);
  return (__aurng() * (__p.b() - __p.a())) + __p.a();
}
Run Code Online (Sandbox Code Playgroud)

适配器的位置是:

一个适配器类,用于将任何 Generator 的输出转换为特定分发的输入.

"任何"听起来让人放心,但它是标准?我特别担心难以检测到的隐藏溢出,这可能会影响分发的正确性.

c++ random c++11

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

如何在QtCreator中的调试器中显示std :: multimap和std :: multiset的内容?

我想检查的内容std::multimap,并std::multiset当地人和表达的窗口QtCreator.

我没有显示值列表,而是显示了实现细节.

奇怪的是,std::mapstd::set对手都很好:

#include <iostream>
#include <map>
#include <set>
#include <string>

int main()
{
    std::multimap<int, std::string> multimap;
    multimap.insert(std::make_pair(1, "one"));
    multimap.insert(std::make_pair(2, "two"));
    multimap.insert(std::make_pair(3, "three"));

    std::multiset<int> multiset = {1,2,3};

    std::map<int, std::string> map;
    map.insert(std::make_pair(1, "one"));
    map.insert(std::make_pair(2, "two"));
    map.insert(std::make_pair(3, "three"));

    std::set<int> set = {1,2,3};

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

我在用:

Qt Creator 3.0.0 
gcc 4.8
GDB 7.6.1
Qt 5.2.0
Ubuntu 13.10
Run Code Online (Sandbox Code Playgroud)

是否支持此功能?

c++ debugging qt gdb qt-creator

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

Loki多方法是否成为C++ 11?

我读使用了现代C++设计泛型编程和设计模式安德烈Alexandrescu的章11多方法的交易正好与我试图解决这个问题.本书的所有源代码都发布在一个名为Loki的库中.

问题是,这本书是相当老的(2001)和有限制的那些交易不再是真实的C++ 11(如该模板参数的数量不能是变量).我试着查看Loki是否已经使用C++ 11进行了重写,但是最后一次修改是在2009年,并且Andrei Alexandrescu的主页上没有更新.然而,在做了一些研究后,我觉得Loki就像Boost一样,它被合并到标准库中.

C++ 11中是否采用了多方法成语或部分内容?

c++ multiple-dispatch loki multimethod c++11

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

如何向 std::exception 添加消息?

我想做以下事情:

std::string fileName = "file";
std::ifstream in(fileName.c_str());
in.exceptions(std::istream::failbit);

try
{
    loadDataFrom(in);
}
catch (std::ios_base::failure& exception)
{
    std::string location = std::string(" in file\n") + fileName;
    // append the "location" to the error message;
    throw;
}
Run Code Online (Sandbox Code Playgroud)

如何将错误消息附加到异常中?

c++

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

如何将QJsonDocument保存并加载到文件?

我正在尝试学习如何使用JSONQt JSON类.例如,我想创建一个简单的QJsonDocument,将其保存到文件,将其加载到另一个文件QJsonDocument并比较结果.

我成功创造了一个QJsonDocument.但是,QJsonDocument 界面中没有简单的命令将其保存到文件中.这同样适用于加载该文件中的文件.

#include <QJsonObject>
#include <QJsonDocument>
#include <QVariant>

int main()
{
    QVariantMap map;
    map.insert("integer", 1);
    map.insert("double", 2.34);
    map.insert("bool", QVariant(true));
    map.insert("string", "word");
    QJsonObject object = QJsonObject::fromVariantMap(map);

    QJsonDocument document;
    document.setObject(object);

    // ?? save document to file
    // ?? load file to document

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

这个答案显示了如何加载文档

  1. 读到一个 QFile
  2. 转换QFileQString
  3. 转换QStringQByteArray
  4. QJsonDocument从中构建QByteArray

有没有更简单的方法来做到这一点?

c++ qt json qt5

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