小编Ins*_*oop的帖子

OpenMP 和嵌套并行性

我想“嵌套”并行使用 OpenMP。这是一个玩具代码:

#include <iostream>
#include <cmath>

void subproblem(int m) {
  #pragma omp parallel for
  for (int j{0}; j < m; ++j) {
    double sum{0.0};
    for (int k{0}; k < 10000000; ++k) {
      sum += std::cos(static_cast<double>(k));
    }
    #pragma omp critical
    { std::cout << "Sum: " << sum << std::endl; }
  }
}

int main(int argc, const char *argv[]) {
  int n{2};
  int m{8};

  #pragma omp parallel for
  for (int i{0}; i < n; ++i) {
    subproblem(m);
  }

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

这就是我想要的: …

c++ openmp

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

模板专业化与模板

我想在C++ 11中定义以下函数:

// This is the general function that should
// never been instantiated
//
template <typename T>
T load(const std::string& filename) {
  return T{};
}
Run Code Online (Sandbox Code Playgroud)

适用于各种类型.

我想将这个函数专门用于类型为std :: vector <S>(或任何模板化类)的类.就像是 :

template <typename std::vector<S>>
std::vector<S> load(const std::string& filename) {
  // Implementation
}
Run Code Online (Sandbox Code Playgroud)

这段代码显然不起作用.但我怎么能这样做?

谢谢你的帮助.

c++ templates

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

如何检查UTF-8字符串是否以'a'开头

我有一个以空终止的UTF-8字符串const char*.我想知道这个字符串的第一个字母是a单独的.以下代码

bool f(const char* s) {
  return s[0] == 'a';
}
Run Code Online (Sandbox Code Playgroud)

是错误的,因为字符串的第一个字母(字形集群)可能是à- 由2个unicode标量值组成:a`.所以这个非常简单的问题似乎很难回答,除非你知道如何制作字形集群.

尽管如此,许多库解析UTF-8文件(例如YAML文件),因此应该能够回答这类问题.但是这些库似乎并不依赖于Unicode库.

所以我的问题是:

  • 如何编写检查字符串是否以字母开头的代码a

  • 假设第一个问题没有简单的答案,解析器(如YAML解析器)如何设法解析文件而不能回答这类问题?

c unicode utf-8 grapheme

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

使用其他参数的默认参数

以下代码在C++中无效

struct Test {
    int x;
    int y;
};

void function(Test A, int n = A.x) {
    ...
}
Run Code Online (Sandbox Code Playgroud)

因为默认参数Ax取决于A.有没有办法解决这个限制?我想要这样做的原因如下.我有一个类Vector,它与std :: vector非常接近,但有一个成员allocator_负责分配内存.我的拷贝构造函数有2个参数:

Vector(const Vector& A, Allocator& allocator) {
    ...
}
Run Code Online (Sandbox Code Playgroud)

如果第二个参数具有默认值,则标准允许此类复制构造函数.但我希望allocator的默认值为A.allocator_,这就是我尝试过的原因

Vector(const Vector& A, Allocator& allocator = A.allocator_) {
    ...
}
Run Code Online (Sandbox Code Playgroud)

不幸的是,它不是有效的C++.你们中有谁有解决这个问题的方法吗?

c++ default-value

2
推荐指数
1
解决办法
275
查看次数

C 文字和溢出

在我的机器上,anint是 32 位,代码如下:

int64_t m = (int64_t) 1 << 60;
int64_t n = (int64_t) 2048 * 2048 * 2048;
Run Code Online (Sandbox Code Playgroud)

给出了 2^60 和 2^33 的数学预期结果,即使标准似乎说 1 和 2048 应该被视为“int”。

我应该认为这个结果是运气,还是 C99 标准保证我不会溢出?

c integer

2
推荐指数
1
解决办法
36
查看次数

emplace_back在std :: vector上

我不明白为什么以下代码由于emplace_back的"错误"使用而无法编译.你能告诉我它有什么问题吗?我可以使用哪些解决方法?

#include <vector>

class Test {
 private:
  std::size_t n_;
  std::vector<double> a_;
  std::vector<double> b_;

 public:
  Test(std::size_t n, std::initializer_list<std::size_t> list)
      : n_(n), a_(list.begin()[0]), b_(list.begin()[1]){};
};

int main() {
  Test t{5, {3, 4}};

  std::vector<Test> v;
  v.emplace_back(5, {3, 4});

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

c++ variadic-templates

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

C++ 11 Threads,它是有效的代码吗?

我正在玩C++ 11的线程功能.但是下面的代码不能在clang(3.5)和gcc(4.9.2)下编译.

#include <iostream>
#include <thread>

void add(int& x) {
    x += 1;
}

int main (int argc, char const *argv[])
{
    int x{ 5 };
    int y{ 8 };

    std::thread my_thread_1{ add, x };
    std::thread my_thread_2{ add, y };
    my_thread_1.join();
    my_thread_2.join();

    std::cout << x << " " << y << std::endl;

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

它是有效的C++ 11吗?

c++ multithreading c++11

0
推荐指数
1
解决办法
59
查看次数