假设我们有一个共享队列(使用数组实现),两个线程可以访问,一个用于从中读取数据,另一个用于向其写入数据.现在,我遇到了同步问题.我正在使用Win32 API(EnterCriticalSection等)实现这一点.
但我的好奇心是队列的入队和出队操作中的关键部分代码是什么?
仅仅因为,两个线程正在使用共享资源?为什么我无法看到任何问题:前端和后端都被维护,因此,当ReaderThread读取时,它可以从前端读取,当WriterThread写入时,它可以轻松写入后端.
可能会出现哪些潜在问题?
如果我这样做:
// (1.)
int* p = new int;
//...do something
delete p;
// (2.)
class sample
{
public:
sample(){}
~sample(){}
};
sample* pObj = new sample;
//...do something
delete pObj;
Run Code Online (Sandbox Code Playgroud)
那么C++编译器如何知道后面的对象delete是内置数据类型还是类对象?
我的另一个问题是,如果我new指向一个数组的指针int然后我,delete []那么编译器如何知道要取消分配的内存块的大小?
原始问题:
我有3个盒子,每个盒子包含200个硬币,因为只有一个人从所有三个盒子中拨打电话,因此每个盒子里有一个硬币有相同的指纹,其余所有硬币都有不同的指纹.您必须找到所有3个盒子中包含相同指纹的硬币.这样我们就可以找到从所有3个方框中拨打电话的人的指纹.
转换问题:
你有3个数组,每个数组包含200个整数.鉴于这3个数组中只有一个共同元素.找到共同的元素.
请考虑解决此问题,除了平凡的O(1)空间和O(n ^ 3)时间.
通过网络搜索,无法找到使用C或C++读/写文件元数据的方法,但是,有可用的工具,并且还有C#和Java中的API来执行此操作.但我想在C或C++中从头开始.
例如,读/写图像元数据.
已经发现有三种格式将元数据写入文件.EXIF,IPTC和XMP.
谢谢.
为什么C不允许具有可变长度参数列表的函数,例如:
void f(...)
{
// do something...
}
Run Code Online (Sandbox Code Playgroud) 我知道编译器可能会也可能不会执行函数的内联扩展,无论程序员是否请求.
我只是很想知道,有没有什么方法可以让程序员确定编译器已经内联了一个特定的函数?
给定一个数组.如何(i, j)在常量时间内找到索引区间中的元素总和.您可以使用额外的空间.
例:
A:3 2 4 7 1 -2 8 0 -4 2 1 5 6 -1
length = 14
int getsum(int* arr, int i, int j, int len);
// suppose int array "arr" is initialized here
int sum = getsum(arr, 2, 5, 14);
Run Code Online (Sandbox Code Playgroud)
总和应该是10在恒定的时间.
输入: {5, 13, 6, 5, 13, 7, 8, 6, 5}
输出: {5, 5, 5, 13, 13, 6, 6, 7, 8}
问题是按照频率的降序排列数组中的数字,保留它们出现的顺序.
如果存在平局,例如在13和6之间的示例中,那么输入数组中首先出现的数字将首先出现在输出数组中.
我遇到了发现这种概率的问题,我的第一次尝试是提出以下算法:我正在计算相对素数的对数.
int rel = 0
int total = n * (n - 1) / 2
for i in [1, n)
for j in [i+1, n)
if gcd(i, j) == 1
++rel;
return rel / total
Run Code Online (Sandbox Code Playgroud)
这是O(n ^ 2).
这是我尝试降低复杂性:
观察(1): 1是相对素数,[2, n]因此n - 1对是微不足道的.
观察(2): 2对于该范围内的偶数不是相对素数,[4, n]因此剩余的奇数是2的相对素数,因此
#Relatively prime pairs = (n / 2) if n is even
= (n / 2 - 1) if n is odd.
Run Code Online (Sandbox Code Playgroud)
所以我的改进算法将是:
int total = …Run Code Online (Sandbox Code Playgroud)