#includetemplateclass MyVector
{
T* m_p;
int m_capacity;
int m_size;
public:
// 構(gòu)造函數(shù)
explicit MyVector() :m_p(NULL), m_capacity(0), m_size(0) {}
explicit MyVector(int capacity)
:m_p(NULL), m_size(0)
{
m_capacity = std::max(0, capacity);
}
explicit MyVector(int size, const T& value)
:m_capacity(size), m_size(size)
{
m_size = std::max(0, size);
m_p = new T[m_capacity];
for (int i = 0; i< m_size; ++i)
m_p[i] = value;
}
MyVector(const MyVector& myVector)
{
Ctor_Helper(myVector);
}
void operator=(const MyVector& myVector)
{
Ctor_Helper(myVector);
}
// 析構(gòu)函數(shù)
virtual ~MyVector()
{
if (m_p != NULL)
delete[] m_p;
}
int Capacity()
{
return m_capacity;
}
int Size()
{
return m_size;
}
void Reserve(int newCapacity) // 新容量大小不能小于數(shù)據(jù)個(gè)數(shù)
{
bool paramsIsValid = (0<= newCapacity && m_size<= newCapacity);
(!!paramsIsValid) || std::cout<< "(錯(cuò)誤)第"<< __LINE__<< "行: "<< "Reserve操作, 無(wú)效參數(shù)\n";
if (!paramsIsValid) return;
if (m_capacity == 0)
{
m_capacity = newCapacity;
m_p = new T[m_capacity];
}
else
{
m_capacity = newCapacity;
T* tmp_p = new T[m_capacity];
memcpy(tmp_p, m_p, m_size * sizeof(T));
delete[] m_p;
m_p = tmp_p;
}
}
bool Empty()
{
return m_size == 0;
}
void Print()
{
for (int i = 0; i< m_size; ++i)
std::cout<< m_p[i]<< ' ';
std::cout<< '\n';
}
T& operator[](int idx)
{
bool paramsIsValid = (0<= idx && idx< m_size);
(!!paramsIsValid) || std::cout<< "(錯(cuò)誤)第"<< __LINE__<< "行: "<< "[]操作, 下標(biāo)越界\n";
if (!paramsIsValid) exit(1);
return m_p[idx];
}
const T& operator[](int idx) const
{
bool paramsIsValid = (0<= idx && idx< m_size);
(!!paramsIsValid) || std::cout<< "(錯(cuò)誤)第"<< __LINE__<< "行: "<< "[]操作, 下標(biāo)越界\n";
if (!paramsIsValid) exit(1);
return m_p[idx];
}
void Insert(int idx, const MyVector& otherVector, int otherIdx, int cnt)
{
Insert_Helper(idx, cnt);
for (int i = 0; i< cnt; ++i)
m_p[idx + i] = otherVector[otherIdx + i];
}
void Insert(int idx, const MyVector& otherVector, int otherIdx)
{
Insert_Helper(idx, otherVector.m_size);
}
void Insert(int idx, int cnt, const T& value)
{
Insert_Helper(idx, cnt);
for (int i = 0; i< cnt; ++i)
m_p[idx + i] = value;
}
void Insert(int idx, const T& value)
{
Insert(idx, 1, value);
}
void Insert(const T& value)
{
Insert(m_size, 1, value);
}
void Remove(int idx, int cnt)
{
bool paramsIsValid = (0<= idx && cnt >= 1 && idx + cnt - 1< m_size);
(!!paramsIsValid) || std::cout<< "(錯(cuò)誤)第"<< __LINE__<< "行: "<< "Remove操作, 無(wú)效參數(shù)\n";
if (!paramsIsValid) return;
for (int i = idx + cnt; i< m_size; ++i)
m_p[i - cnt] = m_p[i];
m_size -= cnt;
}
void Remove(int idx)
{
Remove(idx, 1);
}
void Remove() // 移除一個(gè)尾部元素
{
Remove(m_size - 1, 1);
}
void Clear()
{
m_size = 0;
}
private:
void Ctor_Helper(const MyVector& myVector)
{
if (m_p != NULL)
delete[] m_p;
m_capacity = myVector.m_capacity;
m_size = myVector.m_size;
m_p = new T[m_capacity];
memcpy(m_p, myVector.m_p, m_size * sizeof(T));
}
void Insert_Helper(int idx, int cnt)
{
bool paramsIsValid = (0<= idx && cnt >= 1 && idx<= m_size && INT32_MAX - m_size >= cnt);
(!!paramsIsValid) || std::cout<< "(錯(cuò)誤)第"<< __LINE__<< "行: "<< "Insert操作, 無(wú)效參數(shù)\n";
if (!paramsIsValid || m_capacity == INT32_MAX) return;
m_size += cnt;
if (m_capacity == 0)
{
m_capacity = m_size;
m_p = new T[m_capacity];
}
else
{
bool addCapacity = false;
while (m_size >m_capacity)
{
int tmp = (m_capacity<< 1);
if (tmp >m_capacity)
m_capacity = tmp;
else
m_capacity = INT32_MAX;
addCapacity = true;
}
if (addCapacity)
{
T* tmp_p = new T[m_capacity];
memcpy(tmp_p, m_p, m_size * sizeof(T));
delete[] m_p;
m_p = tmp_p;
}
// 從p[idx]到p[m_size - cnt - 1]的所有元素后移cnt位
for (int i = idx; i< m_size - cnt; ++i)
m_p[i + cnt] = m_p[i];
}
}
};
int main()
{
MyVectormyVector;
std::cout<< myVector[-1]<< '\n';
myVector.Print();
}
? 上面程序中[ ]操作下標(biāo)越界,會(huì)直接終止程序(exit(1))。
創(chuàng)新互聯(lián) - 托管服務(wù)器,四川服務(wù)器租用,成都服務(wù)器租用,四川網(wǎng)通托管,綿陽(yáng)服務(wù)器托管,德陽(yáng)服務(wù)器托管,遂寧服務(wù)器托管,綿陽(yáng)服務(wù)器托管,四川云主機(jī),成都云主機(jī),西南云主機(jī),托管服務(wù)器,西南服務(wù)器托管,四川/成都大帶寬,服務(wù)器機(jī)柜,四川老牌IDC服務(wù)商? 用下面的變量來(lái)存儲(chǔ)T類型的默認(rèn)值,可以只中斷函數(shù)不中斷程序,但會(huì)耗費(fèi)更多的內(nèi)存,如果在m_p不為NULL時(shí)釋放tDefaultValue的內(nèi)存則會(huì)耗費(fèi)更多的時(shí)間。
...代碼...
templateclass MyVector
{
T* m_p;
int m_capacity;
int m_size;
T* tDefaultValue = new T[1]{}; // 存儲(chǔ)T類型的默認(rèn)值
...代碼...
T& operator[](int idx)
{
bool paramsIsValid = (0<= idx && idx< m_size);
(!!paramsIsValid) || std::cout<< "(錯(cuò)誤)第"<< __LINE__<< "行: "<< "[]操作, 下標(biāo)越界\n";
if (!paramsIsValid) return tDefaultValue[0];
return m_p[idx];
}
...代碼...
};
...代碼...
安全性與性能,空間與時(shí)間,需要在設(shè)計(jì)的時(shí)候進(jìn)行權(quán)衡。
例如:在重載[ ]操作的函數(shù)中,我們檢測(cè)了參數(shù)無(wú)效的情況,并輸出錯(cuò)誤提示,[ ]操作函數(shù)提前中斷;有參構(gòu)造函數(shù)中,我們直接處理了參數(shù)無(wú)效的情況,沒(méi)有輸出錯(cuò)誤提示。而引入tDefaultValue變量可以防止因?yàn)橐粋€(gè)BUG而導(dǎo)致整個(gè)程序跑不起來(lái)(雖然并不是一定能成功……)。
你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級(jí)流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級(jí)服務(wù)器適合批量采購(gòu),新人活動(dòng)首月15元起,快前往官網(wǎng)查看詳情吧
文章標(biāo)題:自定義數(shù)據(jù)結(jié)構(gòu)(C++)-創(chuàng)新互聯(lián)
文章鏈接:http://www.rwnh.cn/article30/dpeiso.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站排名、App開(kāi)發(fā)、服務(wù)器托管、App設(shè)計(jì)、虛擬主機(jī)、定制開(kāi)發(fā)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容