你知道如何使用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++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)
问题是,为什么匹配过滤器谓词的值会打印两次? …
有没有办法在没有fork(),execvp()专门使用的情况下启动子进程?
我可以看到std::sort返回void。但是现在ranges已经添加到 C++20 标准中,为什么std::ranges::sort返回一个iterator? cppreference指定:
返回值
一个等于 last 的迭代器。
void什么?以下示例取自 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_if和transform操作的顺序如何?(我知道他们是懒惰的,他们实际上并没有在这一步计算,而不是在实现时计算rng,但这不是重点)。
我可以在这里看到两个选项:
这些操作由 range-v3融合,当rng通过某个迭代器访问给定元素时,这两个操作因此应用于该元素。
当请求给定的元素时,整个remove_if操作将贯穿始终vi,然后该操作的输出向量被送入transform。因此,我们最终得到了一个完整的“ trasformed + removed_if ”向量,它使我们能够访问所需的元素。
我很确定选项 (1) 是实际发生的事情。如果是这种情况,range-v3 是如何实现的?它是否具有某种通用组合代码以组合无限数量的组合视图操作?
附带问题:range-v3 视图公开什么样的迭代器?我认为random-access …
最初的问题是为什么使用以下代码,
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)
经过一些研究并研究潜在的重复项后,我了解到这是 …
我在这一行有一个分段错误:cout << b [0] [0];
有人可以告诉我应该怎么做才能修复我的代码?
cout << b[0][0];
Run Code Online (Sandbox Code Playgroud) 在这样的情况下:
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是供内部使用还是供用户使用。
来自 CUDA 编程指南:
[Warp shuffle 函数] 在 warp 内的线程之间交换变量。
我知道这是共享内存的替代方案,因此它被用于扭曲中的线程来“交换”或共享值。但它背后的直觉是什么(它是如何工作的)?与使用共享内存相比,它有什么好处?
我想知道__attribute__((nonnull))是 C 中的标准还是编译器特定的。如果它是特定于编译器的,那么是否有其他替代方法可以与标准 C 做同样的事情?
我试图阻止静态分析器可能的空指针取消引用警告,但我不想让我的代码编译器依赖。
在最近介绍的 C++20 Ranges 中,我知道views通过使用视图适配器来实现可组合性。我也知道视图不拥有它们的元素,它们的性质是惰性的,也就是说它们只在需要时才进行实际计算。
视图如何实现O(1)移动、复制和分配操作的复杂性?那到我这里来的可能的答案是,意见是刚刚描述的“要计算”业务,他们只是指数据及其转换。
但是,听起来好像视图只是在表达我们的编码序列,并且只有在传递给一些急切的东西(例如算法)时,它们才会在这个特定的单个调用中表现出所有的计算负载。
后续问题:我可以理解如何实现O(1)副本,本质上是指可复制对象(尽管我不知道这是否是ranges::views这样做的)。但我无法理解这将如何在分配操作中发挥作用。同样,一个可能的答案是,因为所有这些都发生在编译时,那么再次“描述”赋值是一个O(1)操作。但是改变一个std::vector<int>被视图查看的,是一个运行时操作(很好的例子)。这还是O(1)手术吗?