或许你可以先看看effective cpp这几本书,我想那对于初学cpp完基本很有帮助。或者说c到cpp
当然我没看过c,学了cpp也没两天, 还会使那句话,all 一切和语言无所关系,狗来认真的话,学俩天也会了。
1顺序表的类成员以及一些接口(可以初学者好好理解一下)
template<class T>
class selfArray
{
private:T* datas;
int size;
int the_most_size;
public:selfArray();
selfArray(int themost);
~selfArray();
void push_back(int i,T value);
void testthemost();
void pop(int i);
void update(int i, T value);
int finddata(int i);
int findindex(T value);
void print();
int findsize();
int The_most_size();
void changethe_most(int most_size,mostsize i);
};
这是我写的一些接口;
一个简单容器应该有它的数量和最大数量
用水桶很好去理解 水桶的大小和它装的水;
首先是他的构造和析构函数
你该好好了解一下作用域 使用内存 释放内存;当然这些和本文来说都是废话。
可以自己重载一些接口这是cpp很好的特性我都感觉。
如果你调用上面的接口我会默认有一个空位吗,emmm我觉得这里我写的有些不好。
然后有参树则是有你自己操控这个水桶的大小(上文举例)如果你不能很自由切换这个概念,那最好不要用这个想法。
如你所见,这是一个扩容机制,当你的桶满了 就需要扩大你的桶,好好理解new 很重要
然后将数据赋值过去,再将原来地址删除,指针在这里显得很重要,好好去看指针篇把那有一张图会让你理解很棒(欧,至少我那么认为) 这里出现了一些警告,当然我不觉得是我的问题。
template<class T>
void selfArray<T>::push_back(int i, T value)
{
if (i<0 || i>size)
{
throw "the failing to add data" ;
}
else
{
size++;
testthemost();
for (int j = size; j > i; --j)
{
datas[j] = datas[j] - 1;
}
datas[i] = value;
}
}
一个加结点的接口。
这样做一个边界判断,如果下表溢出会抛出一个error。显然代码很清楚可以看出
没什么好讲其实细心会发现整体就有点错误,那是我没好好考虑,你可以把错的地方评论区说出来哈哈哈哈哈哈
template<class T>
void selfArray<T>::pop(int i)
{
if (i <= 0 || i>size)
{
throw "the failing to delete data" ;
}
else {
size--;
for (int j = i; j < size; ++j)
{
datas[j] = datas[j + 1];
}
datas[size] = 0;
}
}
一个删除结点的接口,
void selfArray<T>::update(int i, T value)
{
if (i<=0 || i>size)
{
throw "the failing to find data" ;
}
datas[i] = value;
}
template<class T>
int selfArray<T>::finddata(int i)
{
if (i <= 0 || i > size)
{
throw "the failing to find data";
}
return datas[i];
}
template<class T>
int selfArray<T>::findindex(T value)
{
for (int i = 0; i < size; i++)
{
if (datas[i] == value)
{
return i;
}
else
{
cout << "there is not have data in Array" << endl;
}
}
}
替换 查找 ,这一切都不需要解释。
template<class T>
void selfArray<T>::print()
{
for (int i = 0; i < size; ++i)
{
cout << "num" + to_string(i) + ":" << datas[i] << " ";
}
cout << endl;
}
在控制台上打印
对于很多初学者来说会很纠结那些为什么不能在电脑上花里胡哨。
但是其实没必要 即便是图形学
比较难处理的还是逻辑
渲染难只不过逻辑处理难
实际你 只要有些好的gui库 easyx不是一个好的或者说line 只接受整数型变量这很难说清楚。
但你不用太纠结gui库,对于接口你只要知道你给什么参数有什么作用,cpu给显卡的指令不需要你怎么了解。扯远了,shit
template<class T>
void check(selfArray<T>&m1,int i,T value=0,typed x=add)
{
switch (x)
{
case typed::add:try { m1.push_back(i, value); }
catch (const char* msg) { cerr << msg << endl; };
break;
case typed::deleted:try { m1.pop(i); }
catch (const char* msg) { cerr << msg << endl; };
break;
case typed::finded:try { m1.finddata(i); }
catch (const char* msg) { cerr << msg << endl; };
break;
default:try { m1.update(i, value); }
catch (const char* msg) { cerr << msg << endl; };
break;
}
}
template<class T>
void selfArray<T>::changethe_most(int most_size,mostsize i)
{
if (i == mostsize::yes)
{
T* newdata = new T[most_size];
for (int i = 0; i < most_size; ++i)
{
newdata[i] = datas[i];
}
T* temp = datas;
datas = newdata;
delete temp;
}
else if (i==mostsize::no)
{
T* temp = datas;
datas = new T[most_size];
delete temp;
}
}
enum typed
{
add=0,
deleted=1 ,
finded=2 ,
updated=3,
};
enum class mostsize {
yes,
no,
};
这里我想说封装函数很能体现
emmm不知道怎么表达。