定长数组:array容器(C++11标准)
可变数组:vector容器。
类模板的非通用类型参数。
——————————————————————————————
创建一个简单的定长数组容器
#include<iostream>
using namespace std;
template <class T,int len>
class Array
{
private:
T items[len];
public:
Array() { memset(items, 0, sizeof(items)); }
~Array(){}
T& operator[](int ii){ return items[ii]; }
const T& operator[](int ii)const { return items[ii]; }
};
int main() {
Array<int,10>aa;
aa[0] = 0, aa[1] = 1, aa[2] = 2, aa[3] = 3, aa[4] = 4;
for (int ii = 0; ii < 5; ii++)cout << "aa[" << ii << "]=" << aa[ii] << endl;
return 0;
}
aa[0]=0
aa[1]=1
aa[2]=2
aa[3]=3
aa[4]=4
C:\Users\代伟业\Desktop\C++\初始化列表\this指针\x64\Debug\this指针.exe (进程 18292)已退出,代码为 0。
按任意键关闭此窗口. . .
但是如果把数组的数据类型改为字符串string,输出的就乱七八糟了
Array<string,10>aa;
//aa[0] = 0, aa[1] = 1, aa[2] = 2, aa[3] = 3, aa[4] = 4;
aa[0] = "a", aa[1] = "b", aa[2] = "c", aa[3] = "d", aa[4] = "e";
for (int ii = 0; ii < 5; ii++)cout << "aa[" << ii << "]=" << aa[ii] << endl;
aa[0]=
aa[1]=
aa[2]=p
aa[3]=P
aa[4]=`
C:\Users\代伟业\Desktop\C++\初始化列表\this指针\x64\Debug\this指针.exe (进程 5048)已退出,代码为 0。
按任意键关闭此窗口. . .
原因是:string是类,里面有一个指向堆区内存的指针,所以不可以用memset()函数去初始化数组。
把memset那行删掉就好了。
#include<iostream>
using namespace std;
template <class T,int len>
class Array
{
private:
T items[len];
public:
Array() { //memset(items, 0, sizeof(items));
}
~Array(){}
T& operator[](int ii){ return items[ii]; }
const T& operator[](int ii)const { return items[ii]; }
};
int main() {
Array<string,10>aa;
//aa[0] = 0, aa[1] = 1, aa[2] = 2, aa[3] = 3, aa[4] = 4;
aa[0] = "a", aa[1] = "b", aa[2] = "c", aa[3] = "d", aa[4] = "e";
for (int ii = 0; ii < 5; ii++)cout << "aa[" << ii << "]=" << aa[ii] << endl;
return 0;
}
aa[0]=a
aa[1]=b
aa[2]=c
aa[3]=d
aa[4]=e
C:\Users\代伟业\Desktop\C++\初始化列表\this指针\x64\Debug\this指针.exe (进程 12552)已退出,代码为 0。
按任意键关闭此窗口. . .
数组不初始化不太好,办法肯定有,以后再说吧。
函数模板可以有非通用类型参数,类模板也可以。
template <class T,int len>
class Array
{
private:
T items[len];
___________________________________
Array <string,10> aa;
刚才写到的。非通用类型参数可以有缺省值 :
template <class T,int len=10>
class Array
{
private:
T items[len];
___________________________
Array <sting> aa;
________________________________________________________
模板类非通用参数有三个细节;
1.通常是整数(C++20也可以是其他)
2.创建对象的时候必须用常量表达式。
3.在类模板的代码中,不能修改非通用参数的值。
————————————————————————————————————————
创建一个简单的变长数组容器。
template <class T>
class Vector
{
private:
int len;
T* items[len];
public:
Vector(int size):len(size) {
items = new T[len];
}
~Array() {
delete[] items;
items = nullptr;
}
T& operator[](int ii) { return items[ii]; }
const T& operator[](int ii)const { return items[ii]; }
};
再给这个类加一个成员函数:如果数组太小,可以扩展;
#include<iostream>
using namespace std;
template <class T>
class Vector
{
private:
int len;
T* items;
public:
Vector(int size):len(size) {
items = new T[len];
}
~Vector() {
delete[] items;
items = nullptr;
}
void resize(int size) {
if (size <= len)return ;
T* temp = new T[size];
for (int i = 0; i < len; i++) {
temp[i] = items[i];
}
delete[] items;
items = temp;
len = size;
}
int getlen()const { return len; }
T& operator[](int ii) {
if (ii > len)resize(ii+1);
return items[ii]; }
const T& operator[](int ii)const { return items[ii]; }
};
int main() {
Vector <string> aa(1);
aa[0] = "a", aa[1] = "b", aa[2] = "c", aa[3] = "d", aa[4] = "e";
for (int ii = 0; ii < 5; ii++)cout << "aa[" << ii << "]=" << aa[ii] << endl;
return 0;
}