我有一个 C++ 宏,我想用它来调用一个重载的函数模板。我希望这些函数模板之一仅接受浮点值,而另一个函数模板将接受其他所有内容。
以下是我使用 C++ 20 在https://cpp.sh/中运行的代码:
#include <iostream>
#include <string>
#include <vector>
#include <type_traits>
#include <concepts>
template< typename T>
concept NotFloatingPoint = requires
{
!std::is_same_v<T, double> || !std::is_same_v<T, float>;
};
template< NotFloatingPoint T, NotFloatingPoint U, bool isDistanceType_ = false >
void ProcConstantConfigForce( T& value_ )
{
std::cout << "Inside ProcConstantConfigForce()\n";
std::cout << value_;
}
template< typename T>
concept FloatingPoint = requires
{
std::is_same_v<T, double> || std::is_same_v<T, float>;
};
template< FloatingPoint T, FloatingPoint U, bool isDistanceType_ = false > …Run Code Online (Sandbox Code Playgroud) 这是示例代码。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct substruct {
int integer1;
unsigned char boolean1;
unsigned char boolean2;
char *ptr1;
char *ptr2;
} substruct_t;
typedef struct tester {
char *ptr1; //0x00
char *ptr2; //0x08
unsigned char boolean1; //0x10
unsigned char boolean2; //0x11
int integer1; //0x12
// padding bypte 0x16 -> 0x18
char *ptr3; //0x18
// It is not pointer.
substruct_t local; // 0x20
char *ptr4;
} tester_t;
int main()
{
tester_t *tester;
tester = NULL;
printf("0\n");
substruct_t *localptr = …Run Code Online (Sandbox Code Playgroud) 如果我有以下包含一些数据的向量,例如
a <- c(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20)
Run Code Online (Sandbox Code Playgroud)
假设我想将这 20 个值按照排列顺序分为 4 个,如下所示
[1] "1\n2\n3\n4" "5\n6\n7\n8" "9\n10\n11\n12" "13\n14\n15\n16" "17\n18\n19\n20"
Run Code Online (Sandbox Code Playgroud)
我该怎么做呢?我从这个函数开始paste,但我被困住了:(我假设它会涉及一个 for 循环。
paste(a)
Run Code Online (Sandbox Code Playgroud) 我有这门课:
\nclass MyClass {\npublic:\n int someMember;\n std::vector<int> someVectorMember;\n};\nRun Code Online (Sandbox Code Playgroud)\n我想知道为什么这行不通:
\nMyClass(1, std::vector<int>{1,2});\nRun Code Online (Sandbox Code Playgroud)\n错误:
\nmain.cpp:21:37: error: no matching function for call to \xe2\x80\x98MyClass::MyClass(int, std::vector)\xe2\x80\x99\nRun Code Online (Sandbox Code Playgroud)\n 对于这段代码,我使用data()向量的方法来访问其元素:
#include <iostream>
#include <vector>
int main ()
{
std::vector<int> myvector (5);
int* p = myvector.data();
*p = 10;
++p;
*p = 20;
p[2] = 100;
std::cout << "myvector contains:";
for (unsigned i=0; i<myvector.size(); ++i)
std::cout << ' ' << myvector[i];
std::cout << '\n';
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这会产生
myvector contains: 10 20 0 100 0
Run Code Online (Sandbox Code Playgroud)
问题是为什么p[2]是0?假设myvector.data()是一个指向第一个元素(索引 0)的指针,那么p[0]就是 10 就可以了。++p指向下一个元素,即p[1]20,这也很好。现在,p[2]是 后的下一个元素p[1]。所以,顺序应该是10 20 100。这里有什么错误吗?
我使用 TParallel.For 像这样:
procedure TForm1.Button2Click(Sender: TObject);
var
lF: TParallel;
begin
lF := TParallel.Create;
try
lF.&For(1, 100000,
procedure(I: Integer)
var x: Integer;
lList: TStringList;
begin
lList := TStringList.Create;
try
lList.Add(i.ToString);
finally
lList.Free;
end;
end );
finally
FreeAndNIL(lF);
end;
end;
Run Code Online (Sandbox Code Playgroud)
自 Delphi 12(已修补)以来,我可以看到 for 循环结束后 CPU 使用率很高。直到 11.3 CPU 仅在 for 循环执行期间使用,完成后将返回到 0。
有人知道还有其他设置吗?我已经尝试过尝试,TThreadPool.Default.SetMaxWorkerThreads但没有成功。
我有这个 C++ 代码:
int x;
double y;
// do sth
int z = ceil(x*y);
Run Code Online (Sandbox Code Playgroud)
如果x = 410,y = 1.1那么z = 452就该在什么时候451。我更改为z = ceil(float(x*y))并且有效。我的朋友建议z = ceil(double(x)*y)改为。的 2 个定义之间有什么区别吗z?我应该使用哪一个?
还有x*y做什么的?我怀疑它相当于float(x)*y但我不太确定。
#include <cstddef>
float cast(size_t sz){return sz;}
Run Code Online (Sandbox Code Playgroud)
在 Clang 13.0.1 上编译上述代码会-mavx2 -O3生成以下代码:
cast(unsigned long): # @cast(unsigned long)
test rdi, rdi
js .LBB0_1
vcvtsi2ss xmm0, xmm0, rdi
ret
.LBB0_1:
mov rax, rdi
shr rax
and edi, 1
or rdi, rax
vcvtsi2ss xmm0, xmm0, rdi
vaddss xmm0, xmm0, xmm0
ret
Run Code Online (Sandbox Code Playgroud)
GCC、MSVC 和 Intel 编译器以及旧版本也可以生成类似的代码。
我理解该算法的总体目标是解决以下事实:在 AVX-512 之前,没有从 64 位无符号 int 到 float 或 double 的转换指令。
因此,如果数字大到足以被解释为负数,则会将其减半、转换,然后将其加倍。但是,如果在原始整数中设置最低有效位,那么设置它的目的是什么?
这似乎是浪费时间,因为浮点数只有 23 个有效位,并且该位保证不重要。也许如果它是增量指令,则在某些情况下可能会影响有效位。但仅仅一个 or 指令似乎没有做任何事情。
我正在尝试创建一种更有效的方法来对 python 中的列表和字典进行排序,并遇到了Efficient data Structurekeepingingobjectsonmultiplekeys。建议的解决方案是使用heapq模块。
然而,在我的测试中,堆似乎比原生 Python 排序算法慢两倍。下面是我用来做简单测试的代码。结果例如:
堆: 0.005993366241455078
标准: 0.0020036697387695312
有没有办法真正使用堆并提高性能,正如上面链接的帖子声称的那样?该代码会是什么样子?
这是测试它的代码:
import random
import time
from heapq import *
standardlist = []
heaplist = []
for i in range(10000):
num = random.randint(0,10000)
standardlist.append(num)
heappush(heaplist, num)
# Standard sorting method:
start_time = time.time()
sorted_list = sorted(standardlist)
finish_time_1 = time.time() - start_time
# Heap sorting method:
start_time = time.time()
heap_sorted_list = [heappop(heaplist) for i in range(len(heaplist))]
finish_time_2 = time.time() - start_time
print("Standard Finish Time:", finish_time_1) …Run Code Online (Sandbox Code Playgroud) 我有一个数据框,其中一些列的列名称为年份和月份。
ID <- c(1, 3, 9L, 21L, 15L)
names <- c("as", "ds", "sds", "www", "jgh")
`201401` <- c("12L", "310L", "2379L", "234L", "14L")
`201402` <- c("12L", "310L", "2379L", "234L", "14L")
`201403` <- c("12L", "310L", "2379L", "234L", "14L")
`201404` <- c("12L", "310L", "2379L", "234L", "14L")
Run Code Online (Sandbox Code Playgroud)
我想将年月列名称转换为日期格式,以便诸如201401变为Jan 2014等列。
df <- data.frame(ID, names, `201401`, `201402`, `201403`, `201404`, check.names = FALSE)
betterDate <- as.Date(df$201401,"%m/%y") #possible solution ?
Run Code Online (Sandbox Code Playgroud)
获得以下结果的最佳方法是什么?
预期结果 df 列名称为:
ID =c(1, 3, 9L, 21L, 15L)
names = c("as","ds" ,"sds" …Run Code Online (Sandbox Code Playgroud)