添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
本文介绍了一个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. 什么是模板vectorvector是类,可以创建类对象,并对其初始化或赋值操作 vector类似于数组,可存放int,double,string甚至是class等类型的元素,使用[]运算符访问vector元素 2. vector类对象及其创建vector<int> pi;// create vector object,no initialization,vector动态分配内存// 为v