小编joh*_*lis的帖子

C - 计算时间的gettimeofday?

你知道如何使用gettimeofday测量计算时间吗?我可以通过这段代码测量一次:

  char buffer[30];
  struct timeval tv;

  time_t curtime;



 gettimeofday(&tv, NULL); 
 curtime=tv.tv_sec;

 strftime(buffer,30,"%m-%d-%Y  %T.",localtime(&curtime));
 printf("%s%ld\n",buffer,tv.tv_usec);
Run Code Online (Sandbox Code Playgroud)

这个是在计算之前制作的,第二个是在之后.但是你知道如何减去它吗?

编辑:我需要以毫秒为单位的结果.顺便说一句,为什么我在编辑和创建新问题时无法评论和看到按钮?

c

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

为什么 C++ 范围“transform -> filter”为匹配过滤器谓词的值调用两次转换?

考虑使用范围库的以下代码(来自 c++20)

#include <iostream>
#include <ranges>
#include <vector>

int main() {
    std::vector<int> inputs{1, 2, 3, 4, 5, 6};

    auto square_it = [](auto i) {
        std::cout << i << std::endl;
        return i * 2; };

    auto results = inputs | std::views::transform(square_it) | std::views::filter([](auto i){ return i % 3 == 0; });

    for(auto r : results) {
        // std::cout << r << std::endl;
    }
}
Run Code Online (Sandbox Code Playgroud)

函数中的coutinsquare是记录square范围库何时调用该函数。此代码打印

1
2
3
3
4
5
6
6
Run Code Online (Sandbox Code Playgroud)

问题是,为什么匹配过滤器谓词的值会打印两次? …

c++ c++20

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

创建一个没有 fork() 的子进程

有没有办法在没有fork(),execvp()专门使用的情况下启动子进程?

c operating-system fork child-process execvp

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

为什么 range::sort 返回迭代器?

我可以看到std::sort返回void。但是现在ranges已经添加到 C++20 标准中,为什么std::ranges::sort返回一个iterator? cppreference指定:

返回值

一个等于 last 的迭代器。

  1. 这种选择背后的理性是什么?
  2. 与 相比,用例优势是void什么?

c++ iterator std range-v3 c++20

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

Range-v3 视图组合和视图计算并行化

以下示例取自 range-v3 文档,演示了一个简单的views流水线组合以生成一个range

std::vector<int> const vi{1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
using namespace ranges;
auto rng = vi | views::remove_if([](int i){return i % 2 == 1;})
              | views::transform([](int i){return std::to_string(i);});
Run Code Online (Sandbox Code Playgroud)

我知道这views::foo相当于类似的东西foo_view(),因此上面的例子最终是这样的:

transform_view(remove_if_view(vi, <lambda>), <lambda>)
Run Code Online (Sandbox Code Playgroud)

现在的问题是:

remove_iftransform操作的顺序如何?(我知道他们是懒惰的,他们实际上并没有在这一步计算,而不是在实现时计算rng,但这不是重点)。

我可以在这里看到两个选项:

  1. 这些操作由 range-v3融合,当rng通过某个迭代器访问给定元素时,这两个操作因此应用于该元素。

  2. 当请求给定的元素时,整个remove_if操作将贯穿始终vi,然后该操作的输出向量被送入transform。因此,我们最终得到了一个完整的“ trasformed + removed_if ”向量,它使我们能够访问所需的元素。

我很确定选项 (1) 是实际发生的事情。如果是这种情况,range-v3 是如何实现的?它是否具有某种通用组合代码以组合无限数量的组合视图操作?

附带问题:range-v3 视图公开什么样的迭代器?我认为random-access …

c++ std range-v3 c++20 std-ranges

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

范围 filter_view::iterator 元素修改导致 UB

最初的问题是为什么使用以下代码,

std::vector<int> coll{1,4,7,10};

auto iseven = [](auto&& i){return i % 2 == 0; };
auto  colleven = coll | std::views::filter(iseven);

// first view materialization
for(int& i : colleven)
{
    i += 1;
}
for(auto i : coll)
std::cout << i << ' ';
std::cout << std::endl;

// second view materialization
for(int& i : colleven)
{
    i += 1;
}
for(auto i : coll)
std::cout << i << ' ';
Run Code Online (Sandbox Code Playgroud)

通过两次具体化视图,我们得到两个不同的结果。乍一看这确实很奇怪。输出:

1 5 7 11 
1 6 7 11 
Run Code Online (Sandbox Code Playgroud)

经过一些研究并研究潜在的重复项后,我了解到这是 …

c++ iterator range-v3 c++20 std-ranges

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

如何在C++中返回二维数组

我在这一行有一个分段错误:cout << b [0] [0];

有人可以告诉我应该怎么做才能修复我的代码?

cout <<  b[0][0];
Run Code Online (Sandbox Code Playgroud)

c++

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

range-v3 中的 view_closure 是什么?

在这样的情况下:

auto pow = [](int i) {return i * i; };
auto closure = ranges::views::transform(pow);
Run Code Online (Sandbox Code Playgroud)

closure似乎是一个view_closure. 我确实知道最后一行没有多大意义,因为变换没有应用于任何地方。实际上,我也可以将向量输入x其中closure,它既可以编译又可以正常工作

但是,什么视图关闭?它是一个“类似函数”的对象,希望在某个地方应用吗?它的语义是什么?

我从 Eric Niebler 的源代码中找到了这一点range-v3,但在其他地方没有任何文档指定它。

我什至不知道view_closure是供内部使用还是供用户使用。

c++ range-v3 c++20 std-ranges

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

CUDA 中的扭曲改组是什么以及它为何有用?

来自 CUDA 编程指南:

[Warp shuffle 函数] 在 warp 内的线程之间交换变量。

我知道这是共享内存的替代方案,因此它被用于扭曲中的线程来“交换”或共享值。但它背后的直觉是什么(它是如何工作的)?与使用共享内存相比,它有什么好处?

cuda gpu gpu-shared-memory gpu-warp

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

__attribute__((nonnull)) 在 C 中是否标准化

我想知道__attribute__((nonnull))是 C 中的标准还是编译器特定的。如果它是特定于编译器的,那么是否有其他替代方法可以与标准 C 做同样的事情?

我试图阻止静态分析器可能的空指针取消引用警告,但我不想让我的代码编译器依赖。

c compiler-errors

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

Ranges::views 如何实现 O(1) 复杂度?

在最近介绍的 C++20 Ranges 中,我知道views通过使用视图适配器来实现可组合性。我也知道视图不拥有它们的元素,它们的性质是惰性的,也就是说它们只在需要时才进行实际计算。

视图如何实现O(1)移动、复制和分配操作的复杂性?那到我这里来的可能的答案是,意见是刚刚描述的“要计算”业务,他们只是指数据及其转换。

但是,听起来好像视图只是在表达我们的编码序列,并且只有在传递给一些急切的东西(例如算法)时,它们才会在这个特定的单个调用中表现出所有的计算负载。

后续问题:我可以理解如何实现O(1)副本,本质上是指可复制对象(尽管我不知道这是否是ranges::views这样做的)。但我无法理解这将如何在分配操作中发挥作用。同样,一个可能的答案是,因为所有这些都发生在编译时,那么再次“描述”赋值是一个O(1)操作。但是改变一个std::vector<int>被视图查看的,是一个运行时操作(很好的例子)。这还是O(1)手术吗?

c++ complexity-theory range-v3 c++20 std-ranges

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