以下程序的正确行为是什么?
// example.cpp
#include <iostream>
#include <memory>
struct Foo {
void Bar() const {
std::cout << "Foo::Bar()" << std::endl;
}
};
std::shared_ptr<Foo> MakeFoo() {
return std::make_shared<Foo>();
}
int main() {
auto p { MakeFoo() };
p->Bar();
}
Run Code Online (Sandbox Code Playgroud)
当我在Linux RHEL 6.6工作站中编译它时,我得到以下结果:
$ g++ -v
gcc version 5.1.0 (GCC)
$ g++ example.cpp -std=c++14 -Wall -Wextra -pedantic
$ ./a.out
Foo::Bar()
Run Code Online (Sandbox Code Playgroud)
但
$ clang++ -v
clang version 3.6.0 (trunk 217965)
$ clang++ example.cpp -std=c++14 -Wall -Wextra -pedantic
example.cpp:16:4: error: member reference type 'std::initializer_list<std::shared_ptr<Foo> >' …Run Code Online (Sandbox Code Playgroud) 关于科学计算的C++ 有一篇很好的论文,其中作者(T. Veldhuizen)提出了一种基于特征的方法来解决类型推广问题.我使用过这种方法,发现它有效:
#include<iostream>
#include<complex>
#include<typeinfo>
template<typename T1, typename T2>
struct promote_trait{};
#define DECLARE_PROMOTION(A, B, C) template<> struct promote_trait<A, B> { using T_promote = C;};
DECLARE_PROMOTION(int, char, int);
DECLARE_PROMOTION(int, float, float);
DECLARE_PROMOTION(float, std::complex<float>, std::complex<float>);
// similarly for all possible type combinations...
template<typename T1, typename T2>
void product(T1 a, T2 b) {
using T = typename promote_trait<T1, T2>::T_promote;
T ans = T(a) * T(b);
std::cout<<"received "
<<typeid(T1).name()<<"("<<a<<")"<<" * "
<<typeid(T2).name()<<"("<<b<<")"<<" ==> "
<<"returning "
<<typeid(T).name()<<"("<<ans<<")"<<std::endl;
}
int …Run Code Online (Sandbox Code Playgroud) 我正在用Python原型化一个新系统; 功能主要是数字.
一个重要的要求是能够使用不同的线性代数后端:从单个用户实现到通用库,如Numpy.线性代数实现(即后端)必须独立于接口.
我最初的架构尝试如下:
>>> v1 = Vector([1,2,3])
>>> v2 = Vector([4,5,6])
>>> print v1 * v2
>>> # prints "Vector([4, 10, 18])"
Run Code Online (Sandbox Code Playgroud)
# this example uses numpy as the back-end, but I mean
# to do this for a general back-end
import numpy
def numpy_array(*args): # creates a numpy array from the arguments
return numpy.array(*args)
class VectorBase(type):
def __init__(cls, name, bases, attrs):
engine = attrs.pop("engine", None)
if not engine:
raise RuntimeError("you need to specify an engine")
# …Run Code Online (Sandbox Code Playgroud) 两个n维向量的点积u=[u1,u2,...un]和v=[v1,v2,...,vn]被由下式给出u1*v1 + u2*v2 + ... + un*vn.
昨天发布的一个问题鼓励我找到使用标准库,没有第三方模块或C/Fortran/C++调用来在Python中计算点积的最快方法.
我计时了四种不同的方法; 到目前为止,最快的似乎是sum(starmap(mul,izip(v1,v2)))(来自模块的地方starmap和izip来自itertools).
对于下面给出的代码,这些是经过的时间(以秒为单位,一百万次运行):
d0: 12.01215
d1: 11.76151
d2: 12.54092
d3: 09.58523
Run Code Online (Sandbox Code Playgroud)
你能想到更快的方法吗?
import timeit # module with timing subroutines
import random # module to generate random numnbers
from itertools import imap,starmap,izip
from operator import mul
def v(N=50,min=-10,max=10):
"""Generates a random vector (in an array) of dimension N; the
values are integers in the range [min,max]."""
out = …Run Code Online (Sandbox Code Playgroud) Fortran程序生成的一些结果文件使用字母D而不是E例如报告双精度数字(科学记数法):
1.2345D+02
# instead of
1.2345E+02
Run Code Online (Sandbox Code Playgroud)
我需要使用Python处理大量的这些数据,我只是意识到它无法读取D符号中的数字,例如:
>>> A = 1.0D+01
File "<stdin>", line 1
A = 1.0D+01
^
SyntaxError: invalid syntax
Run Code Online (Sandbox Code Playgroud)
我可以更改我的语言环境,让Python知道这D意味着E什么?我真的不想进行全球搜索和替换!
我知道可以用Python这样的语言创建一个自引用列表:
>>> my_list = [1,2]
>>> my_list.append(my_list)
>>> print my_list
[1,2,[...]]
>>> print my_list[0]
1
>>> print my_list[2]
[1,2,[...]]
Run Code Online (Sandbox Code Playgroud)
什么算法从自引用列表中受益?我想不出一个.
谢谢.
我正在尝试提取从CR2拍摄照片的日期/时间(原始照片的佳能格式).
我知道CR2规范,我知道我可以使用Python struct模块从二进制缓冲区中提取片段.
简而言之,规范说在Tag中0x0132 / 306我可以找到一个长度为20的字符串 - 日期和时间.
我尝试使用以下方法获取该标记:
struct.unpack_from(20*'s', buffer, 0x0132)
Run Code Online (Sandbox Code Playgroud)
但我明白了
('\x00', '\x00', "'", '\x88, ...[and more crap])
Run Code Online (Sandbox Code Playgroud)
有任何想法吗?
编辑
非常感谢您的全力以赴!答案是惊人的,我学到了很多关于处理二进制数据的知识.
我需要运行可重现的蒙特卡罗运行.这意味着我使用我存储的已知种子和我的结果,如果我需要使用相同的随机数运行相同的问题实例,则使用该种子.这是常见的做法.
在调查的数值精度的影响,我遇到了以下问题:对于相同的梅森倍捻机的种子,std::uniform_real_distribution<float>(-1, 1)比返回不同的数字std::uniform_real_distribution<double>(-1, 1)和std::uniform_real_distribution<long double>(-1, 1),如下例所示:
#include <iomanip>
#include <iostream>
#include <random>
template < typename T >
void numbers( int seed ) {
std::mt19937 gen( seed );
std::uniform_real_distribution< T > dis( -1, 1 );
auto p = std::numeric_limits< T >::max_digits10;
std::cout << std::setprecision( p ) << std::scientific << std::setw( p + 7 )
<< dis( gen ) << "\n"
<< std::setw( p + 7 ) << dis( gen ) << "\n"
<< std::setw( p …Run Code Online (Sandbox Code Playgroud) 我正在使用LaTeX编写有关Python的文档.本文档将包含代码片段(示例).
我可以使用这个verbatim环境,但在我开始之前,我想知道你是否知道任何为Python代码提供环境的LaTeX样式文件.语法高亮将是一个加号.
谢谢.
编辑:
我必须指出,包装minted正是我想要的.它具有漂亮的语法高亮,使用起来非常简单.检查此问题以了解更多信息.
我在Python中创建了一个模块,它提供了大约十几个功能.虽然它主要在Python中使用,但很多旧版用户都会从Perl中调用它.
插入此模块的最佳方法是什么?我的想法是:
system调用有什么建议吗?