我正在实现一个简单的智能指针,它基本上跟踪它处理的指针的引用数量.
我知道我可以实现移动语义,但我不认为复制智能指针非常便宜.特别是考虑到它引入了产生令人讨厌的错误的机会.
这是我的C++ 11代码(我省略了一些不必要的代码).欢迎提出一般性意见.
#ifndef SMART_PTR_H_
#define SMART_PTR_H_
#include <cstdint>
template<typename T>
class SmartPtr {
private:
struct Ptr {
T* p_;
uint64_t count_;
Ptr(T* p) : p_{p}, count_{1} {}
~Ptr() { delete p_; }
};
public:
SmartPtr(T* p) : ptr_{new Ptr{p}} {}
~SmartPtr();
SmartPtr(const SmartPtr<T>& rhs);
SmartPtr(SmartPtr<T>&& rhs) =delete;
SmartPtr<T>& operator=(const SmartPtr<T>& rhs);
SmartPtr<T>& operator=(SmartPtr<T>&& rhs) =delete;
T& operator*() { return *ptr_->p_; }
T* operator->() { return ptr_->p_; }
uint64_t Count() const { return ptr_->count_; }
const T* …
Run Code Online (Sandbox Code Playgroud) 我一直在测试不同数字序列的不同排序算法的时间复杂度,直到我得到快速排序(在中间有枢轴)的结果一直是一半上升而另一半下降的序列.图:
("V"是指前半部分下降,另一部分上升的序列,"A"是指前半部分上升,另一半下降的序列.
其他类型的序列的结果看起来像我期望的那样,但是我的算法可能有问题吗?
void quicksort(int l,int p,int *tab)
{
int i=l,j=p,x=tab[(l+p)/2],w; //x - pivot
do
{
while (tab[i]<x)
{
i++;
}
while (x<tab[j])
{
j--;
}
if (i<=j)
{
w=tab[i];
tab[i]=tab[j];
tab[j]=w;
i++;
j--;
}
}
while (i<=j);
if (l<j)
{
quicksort(l,j,tab);
}
if (i<p)
{
quicksort(i,p,tab);
}
}
Run Code Online (Sandbox Code Playgroud)
有没有人知道是什么导致了这种奇怪的结果?
在Java中,字符数据类型char
用2个字节表示.n
字符数组char[]
用2n+24
字节表示.
通常,存在24
用于存储n
对象数组的字节开销(至少如果对象是基本类型).
为什么我们需要这些额外的24个字节?它们是如何使用的?
编辑(2015年7月2日).它带给我的注意,在回答这个问题是提供了一个评论这里的程序员StackExchange.
我有一个可用的坐标参考系统列表,我希望将其表示为枚举,如下所示:
import enum
class CRS(enum.Enum):
WGS84 = '4326'
POP_WEB = '3857'
UTM_33N = '3767'
# etc. etc.
Run Code Online (Sandbox Code Playgroud)
当我们只支持几个坐标系统时,这工作得很好,但是现在我们已经决定支持大约60个其他坐标系统,这个列表会变得很大.
是否可以手动输入列表?