小编hiv*_*ert的帖子

c ++ 11快速constexpr整数幂

在这里击败死马.在C中执行整数幂的典型(和快速)方法是经典的:

int64_t ipow(int64_t base, int exp){
  int64_t result = 1;
  while(exp){
    if(exp & 1)
      result *= base;
    exp >>= 1;
    base *= base;
  }
  return result;
}
Run Code Online (Sandbox Code Playgroud)

但是我需要一个编译时整数幂,所以我继续使用constexpr进行递归实现:

constexpr int64_t ipow_(int base, int exp){
  return exp > 1 ? ipow_(base, (exp>>1) + (exp&1)) * ipow_(base, exp>>1) : base;
}
constexpr int64_t ipow(int base, int exp){
  return exp < 1 ? 1 : ipow_(base, exp);
}
Run Code Online (Sandbox Code Playgroud)

第二个函数只是以可预测的方式处理小于1的指数.exp<0在这种情况下,传递是一个错误.

递归版本慢4倍

我在[0,15]范围内生成10E6随机值基数和指数的向量,并在向量上计算两个算法的时间(在进行非定时运行以尝试去除任何缓存效果之后).没有优化,recursice方法的速度是循环的两倍.但是使用-O3(GCC)时,循环比recursice方法快4倍.

我向你们提出的问题是:任何人都可以提出一个更快的ipow()函数来处理指数和0的基数并且可以用作constexpr

(免责声明:我不需要更快的ipow,我只是想看看这里的聪明人能想出什么).

c++ optimization recursion constexpr c++11

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

LLVM中的多线程

我需要生成LLVM代码,它将服务于许多线程/任务(数十万).这些线程应该像英特尔TBB的任务,golang gorutines或其他一样轻量级.当然,它们可以使用外部C++库实现,如提到的Intel TBB(如果它与LLVM兼容).

我在很长一段时间内搜索有关LLVM中线程的任何信息,但我找不到多少.在LLVM的文档中描述了一些API调用,但我认为它不是我正在寻找的.

所以问题很少:

  1. 是否可以将英特尔的TBB或Cilk等技术与LLVM结合使用?
  2. 在这种情况下我应该使用什么线程库?

multithreading tbb llvm cilk cilk-plus

9
推荐指数
1
解决办法
2648
查看次数

C++ set - 密钥小于x的元素数

我有一个set<int>,我想看看它中有多少元素小于x.(x也是int)

我该怎么办?

c++ set stdset

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

枚举所有部分订单

如何有效地枚举有限集上的所有偏序?

我想检查是否存在具有指定属性的部分订单.为了检查这一点,我将用蛮力来枚举小有限集上的所有可能的偏序.

algorithm math discrete-mathematics poset

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

使用rvalue/lvalue了解模板参数推导

这是函数模板的后续跟不识别左值

让我们玩下面的代码:

#include <iostream>
template <class T>
void func(T&&) {
  std::cout<<"in rvalue\n";
}

template <class T>
void func(const T&) {
  std::cout<<"in lvalue\n";
}

int main()
{
    double n=3;
    func<double>(n);
    func(n);
}
Run Code Online (Sandbox Code Playgroud)

它打印:

in lvalue
in rvalue
Run Code Online (Sandbox Code Playgroud)

我不明白第二次电话会发生什么.编译器如何解析模板参数?为什么没有歧义?

c++ templates rvalue lvalue c++11

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

计算大数的二项式概率

我想在python上计算二项式概率.我试着应用这个公式:

probability = scipy.misc.comb(n,k)*(p**k)*((1-p)**(n-k))
Run Code Online (Sandbox Code Playgroud)

我得到的一些概率是无限的.我检查了一些p = inf的值.对于其中一个,n = 450,000,k = 17.该值必须大于1e302,这是浮点数处理的最大值.

然后我试着用 sum(np.random.binomial(n,p,numberOfTrials)==valueOfInterest)/numberOfTrials

这将绘制numberOfTrials样本并计算绘制valueOfInterest值的平均次数.

这不会带来任何无限的价值.但是,这是一种有效的方法吗?为什么这种方式不会产生任何无限的价值而计算概率呢?

python algorithm numpy probability binomial-coefficients

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

算法:打印字符序列的正确索引

我在准备考试时遇到了以下问题:

想象一下单词的字母.例:

a ==> 1
b ==> 2
c ==> 3
...
z ==> 26
ab ==> 27
ac ==> 28
...
az ==> 51
bc ==> 52
and so on.
Run Code Online (Sandbox Code Playgroud)

字符序列只需要按升序排列(即'ab'有效但'ba'不是).

问题:给定任何单词,如果有效则打印其索引,否则打印0.

Input Output
ab 27
ba 0
aez 441 
Run Code Online (Sandbox Code Playgroud)

如何解决这个问题的任何指针将不胜感激.

algorithm combinations combinatorics

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

decltype(constexpr变量)

为什么constexpr变量的decltype失败?

#include <cstdint>
#include <type_traits>

constexpr uint16_t foo(){ return 0;}

constexpr auto cv = foo();
          auto v  = foo();

static_assert( std::is_same< uint16_t, decltype(cv)>::value, "!"); // failed

static_assert( std::is_same< uint16_t, decltype(v) >::value, "!"); // success
Run Code Online (Sandbox Code Playgroud)

c++ static-assert decltype constexpr c++11

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

多子集和计算

我有2套,集合A包含一组随机数,而集合B的元素是集合A的子集的总和.

例如,

A = [8, 9, 15, 15, 33, 36, 39, 45, 46, 60, 68, 73, 80, 92, 96]

B = [183, 36, 231, 128, 137]
Run Code Online (Sandbox Code Playgroud)

我想找到哪个数字是哪个子集的总和与这样的数据.

S = [[45, 46, 92], [36], [8, 15, 39, 73, 96], [60, 68], [9, 15, 33, 80]]
Run Code Online (Sandbox Code Playgroud)

我能用python编写非常愚蠢的暴力代码.

class SolvedException(BaseException):
    pass

def solve(sums, nums, answer):
    num = nums[-1]

    for i in range(0, len(sums)):
        sumi = sums[i]
        if sumi == 0:
            continue
        elif sumi - num < 0:
            continue
        answer[i].append(num)

        sums[i] = sumi - …
Run Code Online (Sandbox Code Playgroud)

python algorithm math subset subset-sum

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

启用c ++ 11时,c ++递归模板的奇怪行为

我正在尝试理解一些递归的C++模板代码,我已经交了,而且我遇到了一些奇怪的行为.出于某种原因,编译器似乎能够在编译时添加两个值,但是必须保留左移以用于运行时.即使这样,只有在我尝试使用c ++ 11构建时才会出现问题.

代码(我已经煮浓,以后你会看到)定义2对模板-一个指定的对shftshft_aux与一个指定的对addadd_aux产生自身递归.顺便说一句,add模板不应该有用,它的唯一目的是证明问题,而不是生成实际min值.

如果我编译此代码没有命令行参数,它编译就好了.但是,如果我指定-std=c++11 -stdlib=libc++,add_aux上的static_assert仍然可以,但shft_aux上的static_assert现在会生成编译时错误static_assert expression is not an integral constant expression.

为什么左移处理不同于添加?

谢谢,克里斯

ps我正在使用clang ++版本 Apple LLVM version 5.1 (clang-503.0.38) (based on LLVM 3.4svn)

#include <climits>

template <unsigned size> struct shft; // forward

template <unsigned size>
struct shft_aux
{
    static const int min = shft<size>::min;
};

template <unsigned size>
struct shft
{
    typedef shft_aux<size - 1> prev;
    static const int min = …
Run Code Online (Sandbox Code Playgroud)

c++ recursion templates c++11 clang++

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