小编Sai*_*rmo的帖子

ostream_iterator vs每个循环效率

昨天看到这个用户发帖.我认为这是输出矢量的一种很酷的方式.所以我输入了一个例子并问自己这与for each循环相比如何?

template <typename T>
void printVectorO(std::vector<T> &v)
{
    std::cout << "Ostream_iterator contents: " << std::endl;
    auto start = std::chrono::high_resolution_clock::now();
    std::ostream_iterator<T> ost(std::cout, " ");
    std::copy(begin(v), end(v), ost);
    std::cout << std::endl;

    auto end = std::chrono::high_resolution_clock::now();
    auto time = end - start;
    auto nano = std::chrono::duration_cast<std::chrono::nanoseconds>(time);
    std::cout << "Ostream_iterator computation took: " << nano.count() << " nano seconds"<< std::endl;
    std::cout << std::endl;
}

template <typename T>
void printVectorC(std::vector<T> &v)
{
    std::cout << "For Each Loop contents: …
Run Code Online (Sandbox Code Playgroud)

c++ performance foreach iterator

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

在只读情况下,什么时候需要空终止的字符串?

我一直在研究该std::string_view库,并且一直在考虑更改我一直在努力使用的代码库std::string_view。但是,在我阅读过的许多主题中,有关何时何地使用std::string_view而不是的主题const std::string &。我已经看到许多答案说:“何时不需要以null结尾的字符串。” 因此,当我开始在网上搜索“何时需要以null结尾的字符串?”时,在这个问题上,我还没有真正有用的答案。

我可以想到一个外部库的示例,您需要链接到该外部库std::string。在那种情况下,您将需要一个以null结尾的字符串,因为该库需要它。我猜另一个例子是,如果您需要修改字符串本身,但是const &如果我们需要修改它,那么我们就不会通过。

那么什么时候需要使用以null结尾的字符串?

我看过的链接:

  1. std :: string_view比const std :: string&到底有多快?
  2. 什么时候可以传递const&std :: string而不是std :: string_view?
  3. 为什么只有字符串视图?
  4. 在C ++ 17中使用const std :: string&参数是否有意义?

c++ string string-view c++17

7
推荐指数
2
解决办法
253
查看次数

QOpenGLWindow 和 QOpenGLWidget 之间的性能差异是什么?

我一直在研究两个类QOpenGLWindowQOpenGLWidget。在 QOpenGLWindow 的文档中,它指出:“与 QOpenGLWidget 不同,QOpenGLWindow 不依赖于 widgets 模块,并提供更好的性能。” 在我当前的项目中,我制作了一个QMainWindow带有Dock 小部件QDockWidgetOpenGLWidget

对于这个项目,我需要 GL 部分尽可能高效,所以我想知道是否值得尝试将其转换为QOpenGLWindow. 但是,我不知道性能差异是什么。如果它很小,那么我将保留当前的格式,如果差异很大,那么我将转换它。

有谁知道性能差异是什么?

performance qt qwidget qwindow qopenglwidget

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

Boost 1.69中的某些库是否与MacOS不兼容?

我正在尝试编译在使用Ubuntu 18.04和Windows 10编译时没有问题的程序。但是,当我尝试在OSX High Sierra上编译时,出现错误,它们仅与boost相关。

这是一个例子:

#include <boost/process.hpp>
#include <iostream>

int main()
{
  std::cout << "This is a test." << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

然后我试图与这两个编译程序g++clang这样的:

g++ -std=c++11 test.cpp -lpthread
Run Code Online (Sandbox Code Playgroud)

然后,我得到了这个巨大的错误:

In file included from test.cpp:1:
In file included from /usr/local/include/boost/process.hpp:24:
In file included from /usr/local/include/boost/process/async_system.hpp:22:
In file included from /usr/local/include/boost/process/child.hpp:21:
In file included from /usr/local/include/boost/process/detail/child_decl.hpp:30:
/usr/local/include/boost/process/detail/posix/wait_for_exit.hpp:60:7: error: expected unqualified-id
    ::sigemptyset(&sigset);
      ^
/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/include/signal.h:125:26: note: expanded from macro 'sigemptyset'
#define sigemptyset(set)        (*(set) = 0, 0)
                                ^
In file included from …
Run Code Online (Sandbox Code Playgroud)

c++ macos boost

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

graph6 格式如何工作?

我一直在到处寻找 .g6 或 graph6 格式的工作原理,但我什至不知道它是如何工作的,我发誓它就像魔术一样。

F?B~w
Run Code Online (Sandbox Code Playgroud)

那是以 ASCII 形式表示的图形。它可以由 Wolfram Mathematica、Sage 和 Maple 解释,仅举几例,并为我们提供视觉效果。然而,在深入研究 Sage 的开源代码数小时后,我终生无法弄清楚他们如何将其解读为图表。

我想知道是否可以在上面的图中搜索哈密顿循环而不必将它们转换为邻接矩阵?或者,如果这不可能,我们如何将其转换为邻接矩阵?

任何帮助,将不胜感激。

graph

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

使用任何参数创建 std::functions 的 unordered_map?

我正在尝试创建一个无序的std::functions. 其中键是一个字符串,您将在其中查找要调用的函数,而函数是值。

我写了一个小程序:

#include <iostream>
#include <unordered_map>
#include <functional>
#include <string>

void func1()
{
  std::cout << "Function1 has been called." << std::endl;
}

int doMaths(int a)
{
  return a + 10;
}

int main()
{
  std::unordered_map<std::string,std::function<void()>> myMap;

  myMap["func1"] = func1;

}
Run Code Online (Sandbox Code Playgroud)

这编译得很好,我可以通过放置来调用该函数(但是我不确定这是否是正确的方法):

auto mapIter = myMap.find("func1");
auto mapVal = mapIter->second;
mapVal();
Run Code Online (Sandbox Code Playgroud)

然后调用该函数,但是我认为这是以创建该函数的新副本为代价的?如果我错了,请纠正我。

但是,如果我尝试这样做:myMap["doMaths"] = doMaths;由于 in 中的值myMapisstd::function<void()>>而 not ,我会收到编译器错误std::function<int(int)>>。当我这样做时,我确实得到了这个编译:myMap["doMaths"] = std::bind(doMaths,int());但是我不知道它实际上做了什么。当我尝试以与 相同的方式调用它时func1,出现编译器错误。

所以我想我有两个问题:

我如何创建一个 unordered_map 它将采用任何类型的函数作为它的值?以及如何在地图中调用该函数而不必复制该函数?

c++ unordered-map c++11

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

如何在需要两个参数的函数的向量上使用 std::ranges ?

我一直在尝试了解新的范围库,并尝试将一些更传统的 for 循环转换为函数代码。cppreference给出的示例代码非常简单易读。但是,我不确定如何将范围应用于点向量,该点向量需要查看、计算并比较每个 x 和 y 值,并在最后比较最大距离。

struct Point
{
  double x;
  double y;
}

double ComputeDistance(const Point& p1, const Point& p2)
{
  return std::hypot(p1.x - p2.x, p1.y - p2.y);
}

double GetMaxDistance(const std::vector<Point>& points)
{
  double maxDistance = 0.0;

  for (int i = 0; i < points.size(); ++i)
  {
    for(int j = i; j < points.size(); ++j)
    {
      maxDistance = std::max(maxDistance, ComputeDistance(points.at(i),points.at(j)));
    }
  }
  return maxDistance;
}
Run Code Online (Sandbox Code Playgroud)

GetMaxDistance是我想尝试清理并应用范围的代码。我认为这就像做类似的事情一样简单:

double GetMaxDistance(const std::vector<Point>& points)
{
  auto result = …
Run Code Online (Sandbox Code Playgroud)

c++ functional-programming c++20 std-ranges

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