我是靠谱客的博主 俊逸砖头,最近开发中收集的这篇文章主要介绍[C++]STL-容器元素深拷贝与浅拷贝问题以及STL共性机制,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

STL容器共性机制

除了queue和stack之外,每个容器都提供可返回迭代器的函数,运用返回的迭代器可以访问元素

通常STL不会抛出异常,需要使用者传入正确的参数

每个容器都提供了一个默认的构造函数和默认的拷贝构造函数

大小相关的构造方法:1 size()返回容器中元素的个数 2 empty()判断容器是否为空

STL容器使用机制

vectordequelistsetmultisetmapmultimap
典型内存机构单端数组双端数组双向链表二叉树二叉树二叉树二叉树
可随机读取对key而言:是
元素搜索速度非常慢对key而言:快对key而言:快
元素安插移除尾端头尾两端任何位置

容器元素深拷贝与浅拷贝问题

#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<vector>
#include<map>
using namespace std;
class Person {
public:
Person(){}
Person(char* name,int age){
this->mName = new char[strlen(name) + 1];
strcpy(this->mName, name);
this->mAge = age;
}
Person(const Person& p) {
this->mAge = p.mAge;
this->mName = new char[strlen(p.mName) + 1];
strcpy(this->mName, p.mName);
}
Person& operator=(const Person &p) {
if (this->mName != NULL) {
//判断是否原来定义过,如果定义过就清除原来数据
delete[] this->mName;
}
this->mAge = p.mAge;
this->mName = new char[strlen(p.mName) + 1];
strcpy(this->mName, p.mName);
return *this;
}
~Person() {
if (this->mName != NULL) {
delete[] this->mName;
}
}
char* mName;
//涉及指针,容易出现浅拷贝问题
int mAge;
};
/*
c++ 析构函数调用时间:
1、对象生命周期结束,被销毁时;
2、delete指向对象的指针时,或delete指向对象的基类类型指针,而其基类虚构函数是虚函数时;
3、对象i是对象o的成员,o的析构函数被调用时,对象i的析构函数也被调用。
*/
void CopyTest1() {
/*
这里首先实例化了p1对象,又把p1对象放到了vector容器中
在这个过程中实际上是调用了类的拷贝构造,简单的把值和指针拷贝到了容器中
这就导致了两个对象的指针指向同一内存地址
在这段函数结束时,会分别调用p1和vPerson的析构函数
也就导致了p1对象被析构了两次 因此程序会报错
所以这里需要重载 = 号,以及拷贝构造
使得在将对象放至容器中调用拷贝构造时,将新创建的对象放至新的内存地址
保证对象不被重复析构
*/
Person p1("Bob",18);
vector<Person> vPerson;
vPerson.push_back(p1);
vector<Person>::iterator it = vPerson.begin();
cout << "姓名:" << (*it).mName << " 年龄:" << (*it).mAge << endl;
}
int main() {
CopyTest1();
return 0;
}

最后

以上就是俊逸砖头为你收集整理的[C++]STL-容器元素深拷贝与浅拷贝问题以及STL共性机制的全部内容,希望文章能够帮你解决[C++]STL-容器元素深拷贝与浅拷贝问题以及STL共性机制所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(82)

评论列表共有 0 条评论

立即
投稿
返回
顶部