STL中存储的元素都是按照值拷贝得来的

理论提高:所有容器提供的都是值(value)语意,而非引用(reference)语意。容器执行插入元素的操作时,内部实施拷贝动作。所以STL容器内存储的元素必须能够被拷贝(必须提供拷贝构造函数)。

 

 

  • 除了queue与stack外,每个容器都提供可返回迭代器的函数,运用返回的迭代器就可以访问元素。
  • 通常STL不会丢出异常。要求使用者确保传入正确的参数。
  • 每个容器都提供了一个默认构造函数跟一个默认拷贝构造函数。
  • 如已有容器vecIntA。
  • vector<int> vecIntB(vecIntA);  //调用拷贝构造函数,复制vecIntA到vecIntB中。
  • 与大小相关的操作方法(c代表容器):

c.size();   //返回容器中元素的个数

c.empty();   //判断容器是否为空

  • 比较操作(c1,c2代表容器):

c1 == c2     判断c1是否等于c2

c1 != c2      判断c1是否不等于c2

c1 = c2        把c2的所有元素指派给c1

 

下面举一个源代码的例子,具体如下:

#define _CRT_SECURE_NO_WARNINGS

#include <iostream>
using namespace std;
#include "vector"

class Teacher
{
public:
	Teacher(const char* name, int age)
	{
		m_pname = new char[strlen(name) + 1];
		strcpy(m_pname, name);
		m_age = age;
	}
	~Teacher()
	{
		if (m_pname != NULL)
		{
			delete[] m_pname;
			m_pname = NULL;
			m_age = 0;
		}
	}

	//Teacher t2 = t1;
	Teacher(const Teacher& obj)
	{
		cout << "调用拷贝构造函数" << endl;
		m_pname = new char[strlen(obj.m_pname) + 1];
		strcpy(m_pname, obj.m_pname);
		m_age = obj.m_age;
	}

	//重载 =号操作符
	//t3 = t2 = t1
	Teacher& operator=(const Teacher& obj)
	{
		//先把t2的旧的内存释放掉
		if (m_pname != NULL)
		{
			delete[] m_pname;
			m_pname = NULL;
			m_age = 0;
		}

		//根据t1的大小分配内存 
		m_pname = new char[strlen(obj.m_pname) + 1];
		//copy t1的数据
		strcpy(m_pname, obj.m_pname);
		m_age = obj.m_age;
		return *this;
	}

public:

	void printT()
	{
		cout << m_pname << "\t" << m_age << endl;
	}
protected:
private:
	char* m_pname;
	int		m_age;
};

void main1301()
{
	Teacher t1("t1", 31);
	t1.printT();

	vector<Teacher> v1;
	v1.push_back(t1); //把t1拷贝了一份存入到容器中了。
	                  //在STL的容器中,都是值拷贝(对象也一样),所以这里把对象放入到容器中会执行拷贝构造函数
}
void main()
{
	main1301();
	cout << "hello..." << endl;
	system("pause");
	return;
}

 

已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页