c++之旅第十一弹——顺序表

大家好啊,这里是c++之旅第十一弹,跟随我的步伐来开始这一篇的学习吧!

如果有知识性错误,欢迎各位指正!!一起加油!!

创作不易,希望大家多多支持哦!

一,数据结构的概念:

1.什么是数据结构?

数据结构是指计算机存储和组织数据的方式

使用合理的数据结构能够提高程序的运行效率,内存利用率等

2.数据结构的两个层次:

(1)逻辑结构:分为线性和非线性两种,线性即为没有分支的一个接着一个,非线性即为有分支或无逻辑上的连续关系

(2)存储结构:

①线性:分为连续存储(数组)和链式存储(链表)

②非线性:索引存储和散列存储

二,顺序表:

1.属于线性表中的连续存储型

2.顺序表的特点:

(1)、因为地址是连续的所以可以通过下标(索引)访问

(2)、顺序表可以是静态(静态定好大小的数组)也可以是动态(用指针来开辟的空间)

(3)、顺序表随机访问方便,但是插入和删除中间的数据比较困难

3.顺序表的功能实现及完善:(eg:数组的增删查改)

类模板的使用可以避免每一次使用时需要写逻辑代码:

头文件CMyArray.h内容如下:

template <class T>//typename可以用来替换class 
class CMyArray
{
    T *pBuff;
    size_t maxSize;
    size_t len;
public:
    CMyArray();
    CMyArray(CMyArray const& other);
    ~CMyArray();
public:
    void push_back(T const& elem);//尾部添加
    void insert(int index, T const& elem);//在index位置插入
    void pop_back();//尾部删除
    void erase(int index);//删除index位置的值
    T& at(int index);//得到下标index的值
    int find(T const& elem) const;//查找参数是否在数组中
public:
    bool empty() const;//判断当前数组是否是空
    size_t size() const;//得到当前数组元素个数
    size_t maxLen() const;//得到当前数组可以存放的最大元素个数
private:
    void _resetMemory();//扩容内存
};
​
template <class T>
void CMyArray<T>::_resetMemory()
{
    if (len >= maxSize)
    {
        maxSize += (maxSize >> 1) > 1 ? (maxSize >> 1) : 1;
        T *pTemp = new T[maxSize];
        for (size_t i = 0; i < len; ++i)
            pTemp[i] = pBuff[i];
        if (pBuff) delete[] pBuff;
        pBuff = pTemp;
    }
}
​
template <class T>
size_t CMyArray<T>::maxLen() const
{
    return maxSize;
}
​
template <class T>
size_t CMyArray<T>::size() const
{
    return len;
}
​
template <class T>
bool CMyArray<T>::empty() const
{
    return len == 0;
    //return pBuff == nullptr;
    //使用这个可能有指针指向的内存为未知而不是空的情况,而此时数组实际为空了,所以用上面那个方式更准确 
}
​
template <class T>
int CMyArray<T>::find(T const& elem) const
{
    for (size_t i = 0; i < len; ++i)
    {
        if (pBuff[i] == elem)
            return i;
    }
    return -1;
}
​
template <class T>
T& CMyArray<T>::at(int index)
{
    if (index < 0 || index >= (int)len)
        throw "out_of_range";
    return pBuff[index];
}
​
template <class T>
void CMyArray<T>::erase(int index)
{
    if (index < 0 || index >= (int)len)
        throw "out_of_range";
    for (size_t i = index; i < len; ++i)
        pBuff[i] = pBuff[i + 1];
    len--;
}
​
template <class T>
void CMyArray<T>::pop_back()
{
    len--;
}
​
template <class T>
void CMyArray<T>::insert(int index, T const& elem)
{
    if (index < 0 || index >= (int)maxSize)
        throw "out_of_range";
    //if (len >= maxSize)
    //{
    //  maxSize += (maxSize >> 1) > 1 ? (maxSize >> 1) : 1;
    //  T *pTemp = new T[maxSize];
    //  for (size_t i = 0; i < len; ++i)
    //      pTemp[i] = pBuff[i];
    //  if (pBuff) delete[] pBuff;
    //  pBuff = pTemp;
    //}
    //重复内容进行了封装 
    _resetMemory();
​
    for (int i = (int)len - 1; i >= index; --i)
        pBuff[i + 1] = pBuff[i];
    pBuff[index] = elem;
    len++;
}
​
template <class T>
void CMyArray<T>::push_back(T const& elem)
{
    //if (len >= maxSize)
    //{
    //  maxSize += (maxSize >> 1) > 1 ? (maxSize >> 1) : 1;
    //  T *pTemp = new T[maxSize];
    //  for (size_t i = 0; i < len; ++i)
    //      pTemp[i] = pBuff[i];
    //  if (pBuff) delete[] pBuff;
    //  pBuff = pTemp;
    //}
    _resetMemory();
    pBuff[len++] = elem;
}
​
template <class T>
CMyArray<T>::CMyArray(CMyArray const& other)
{
    maxSize = other.maxSize;
    len = other.len;
    pBuff = nullptr;
    if (other.pBuff)
    {
        pBuff = new T[maxSize];
        for (size_t i = 0; i < len; ++i)
            pBuff[i] = other.pBuff[i];
    }
}
​
template <class T>
CMyArray<T>::~CMyArray()
{
    if (pBuff)
        delete[] pBuff;
    pBuff = nullptr;
    maxSize = len = 0;
}
​
template <class T>
CMyArray<T>::CMyArray()
{
    pBuff = nullptr;
    maxSize = len = 0;
}

.cpp文件内容如下:

 
#include "CMyArray.h"
void main()
{
    CMyArray<int> ma;
    for (int i = 0; i < 10; ++i)
        ma.push_back(i + 1);
    
    ma.insert(1, 123);
    ma.pop_back();
    ma.erase(3);
    
    for (size_t i = 0; i < ma.size(); ++i)
        printf("%d\t",ma.at(i));
    printf("\n");
​
}
 

  • 33
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 52
    评论
好的,窗体上添加控件和图形是游戏开发中非常重要的一部分。在C/C++中,可以使用Win32 API来实现窗体上的控件和图形的添加。 首先,需要创建一个窗口。可以使用CreateWindowEx函数创建一个窗口,函数的参数包括窗口类名、窗口标题、窗口样式、窗口位置、窗口大小等信息。例如: ```C++ HWND hwnd = CreateWindowEx( 0, L"窗口类名", L"窗口标题", WS_OVERLAPPEDWINDOW, x, y, width, height, NULL, NULL, hInstance, NULL ); ``` 其中,hInstance是指向当前应用程序实例的句柄,可以通过WinMain函数的参数获取。 接下来,需要在窗口上添加控件,比如按钮、标签、文本框等。可以使用CreateWindowEx函数来创建这些控件。需要指定控件类名、控件标题、控件样式、控件位置、控件大小等信息。例如: ```C++ HWND hButton = CreateWindowEx( 0, L"BUTTON", L"按钮", WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, x, y, width, height, hwnd, (HMENU)1, hInstance, NULL ); ``` 其中,控件类名为"BUTTON",样式为WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,表示创建一个可见的子窗口按钮。控件的位置和大小由x、y、width、height参数指定。hwnd参数为父窗口的句柄,通过它可以将按钮添加到窗口上。(HMENU)1表示按钮的ID为1。 除了按钮之外,还可以创建其他类型的控件,比如标签、文本框等。只需要将控件类名和样式替换即可。例如: ```C++ HWND hStatic = CreateWindowEx( 0, L"STATIC", L"标签", WS_CHILD | WS_VISIBLE | SS_LEFT, x, y, width, height, hwnd, NULL, hInstance, NULL ); HWND hEdit = CreateWindowEx( 0, L"EDIT", L"文本框", WS_CHILD | WS_VISIBLE | WS_BORDER | ES_LEFT, x, y, width, height, hwnd, NULL, hInstance, NULL ); ``` 最后,可以在窗口上绘制图形。可以使用GDI+库提供的函数来实现。例如,可以在窗口上绘制一个矩形: ```C++ HDC hdc = GetDC(hwnd); Graphics graphics(hdc); Pen pen(Color(255, 0, 0, 0)); graphics.DrawRectangle(&pen, x, y, width, height); ReleaseDC(hwnd, hdc); ``` 其中,GetDC函数获取窗口的DC句柄,Graphics类是GDI+库中的一个类,用于绘制图形,Pen类用于设置画笔的颜色和粗细,Color类用于表示颜色,255表示不透明度,0、0、0分别表示红、绿、蓝三个通道的颜色值。DrawRectangle函数用于绘制矩形,参数为画笔和矩形的位置和大小。最后,需要通过ReleaseDC函数释放DC句柄。 以上就是在C/C++中实现窗体上添加控件和图形的方法。
评论 52
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值