本文介绍了一个C++模板类UserVector的实现,包括构造函数、析构函数、重载运算符等。在主测试函数中,展示了UserVector如何存储和操作int类型及自定义类People的对象,强调了在自定义类装入容器时实现拷贝构造函数的重要性。
摘要由CSDN通过智能技术生成
//构造函数与析构函数
UserVector(int len = 0); //有了默认初始参数,不需要在写无参构造函数 UserVector();
UserVector(UserVector<user_t>& v); //UserVector<user_t> 必须指明类型来告诉编译器如何分配内存
~UserVector();
public:
//重载函数
user_t& operator[](int index);
friend ostream& operator<< <user_t> (ostream& out, UserVector<user_t>& u);
UserVector<user_t>& operator=(UserVector<user_t>& u);
private:
int len;
user_t* p;
#pragma once
表示只包含一次该头文件,防止重复包含导致的重定义,相当于C语言中的
#ifndef _USER_VECTOR_H
#define _USER_VECTOR_H
#endif
UserVector.cpp文件
#include "UserVector.h"
template<typename user_t>
UserVector<user_t>::UserVector(int len)
this->len = len;
this->p = new user_t[this->len];
template<typename user_t>
UserVector<user_t>::UserVector(UserVector<user_t>& v)
this->len = v.len;
this->p = new user_t[this->len];
for (int i = 0; i < this->len; i++)
this->p[i] = v.p[i];
template<typename user_t>
UserVector<user_t>::~UserVector()
if (this->p != NULL)
delete[] this->p;
this->p = NULL;
this->len = 0;
template<typename user_t>
user_t& UserVector<user_t>::operator[](int index)
return this->p[index];
template<typename user_t>
//std::ostream& operator<< <user_t> (std::ostream& out, UserVector<user_t>& u)
//错误 C2768 “operator << ”: 非法使用显式模板参数
std::ostream& operator<<(std::ostream& out, UserVector<user_t>& u)
for (int i = 0; i < u.len; i++)
out << u.p[i] << " ";
return out;
template<typename user_t>
UserVector<user_t>& UserVector<user_t>::operator=(UserVector<user_t>& u)
if (this->p != NULL)
delete[] this->p;
//无需置NULL,因为下面立马要修改
this->len = u.len;
this->p = new user_t[this->len];
for (int i = 0; i < this->len; i++)
this->p[i] = u.p[i];
return *this;
这里注意,在类模板中重载运算符的时候一定不能乱用友元函数,一般只有重载左移右移运算符时,才能使用友元函数,否则会报各种错误,并且在重载左移右移运算符的时候,函数声明一定要这样声明
friend ostream& operator<< <user_t> (ostream& out, UserVector<user_t>& u);
主测试函数函数如下
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
using namespace std;
//#include "UserVector.h" //报一堆错
#include "UserVector.cpp"
void FuncTest1()
//1. int 类型的容器
UserVector<int> i1(10);
for (int i = 0; i < 10; i++)
i1[i] = i;
cout << "i1: " << i1 << endl;
UserVector<int> i2 = i1;
cout << "i2: " << i2 << endl;
UserVector<int> i3;
i3 = i2;
cout << "i3: " << i3 << endl;
//2. char
UserVector<char> c1(3);
c1[0] = 'a';
c1[1] = 'b';
c1[2] = 'c';
cout << "c1: " << c1 << endl;
UserVector<char> c2;
c2 = c1;
cout << "c2: " << c2 << endl;
class People
public:
People()
this->age = 0;
this->name = NULL;
People(int age, const char* p) //装入容器时,必须要有拷贝构造函数
this->age = age;
this->name = new char[strlen(p) + 1];
strcpy(this->name, p);
People(People& p)
this->age = p.age;
this->name = new char[strlen(p.name) + 1];
strcpy(this->name, p.name);
~People()
if (this->name != NULL)
delete[] this->name;
this->name = NULL;
this->age = 0;
public:
People& operator=(People& p)
if (this->name != NULL)
delete[] this->name;
this->name = new char[strlen(p.name) + 1];
this->age = p.age;
strcpy(this->name, p.name);
return *this;
friend ostream& operator<<(ostream& out, People& p)
out << p.name << ": " << p.age << endl;
return out;
private:
int age;
char* name;
void FuncTest2()
People p1(16, "p1"), p2(17, "p2"), p3(18, "p3");
UserVector<People> V(3);
V[0] = p1;
V[1] = p2;
V[2] = p3;
cout << V[0] << V[1] << V[2] << endl;
int main()
//装入普通类型
FuncTest1();
//装入 类对象
FuncTest2();
system("pause");
return 0;
在向容器中装入自己定义的类对象时,一定要自己实现拷贝构造函数,否则可能出现浅拷贝的问题。
类模板实例 实现vector容器
STL的vector容器是一个动态扩容顺序容器,底层就是一个二倍扩容的数组。
在实现vector时,它的实现并没有使用一个数组指针+当前有效位置下标+数组容量大小的形式实现,而是用三个指针来维护这个数组。
有三个指针_first、_last、_end,_first为数组的起始地址,_last指向最后一个有效元素的后继位置,_end指向数组末尾的后继位置。
_first == _last时,容器为空,_last == _end时,容器满,_end - _first 为容器容
vector容器是一个模板类,可以存放任何类型的对象(但必须是同一类对象)。vector对象可以在运行时高效地添加元素,并且vector中元素是连续存储的。
vector的构造
函数原型:
template<typename
explicit
vector();
vector 是什么?
vector收录在STL(C++标准库)里,是一种特殊的数据结构,名字叫做“动态数组”或者“不定长数组”,有时也被翻译成“容器”。其实就是一种非静态数组,可以进行修改、增长。
vector简单用法
vector<int>test;//建立一个vector
test.push_back(1);
test.push_back(2);//把1和2压入vector这...
1. 什么是模板类vector?
vector是类,可以创建类对象,并对其初始化或赋值操作
vector类似于数组,可存放int,double,string甚至是class等类型的元素,使用[]运算符访问vector元素
2. vector类对象及其创建vector<int> pi;// create vector object,no initialization,vector动态分配内存// 为v