当前位置: 首页 > article >正文

c++ STL容器 --- 动态数组vector

包含头文件<vector>

vector<int> vecData;
  • 模板类型:存储数据类型(数组的类型):int 

  • 不带长度 / 带长度的创建方式、带初始化的创建方式

处理基本数据类型

不带长度的创建方式

//辅助函数:遍历容器
template <class _Ty>
void printVector(vector<_Ty>& temp) 
{for (auto v : temp) {cout << v << "\t ";}cout << endl;
}//要存储的数据类型写在<>中
void testCreateVector() 
{vector<int> vecData;//只能采用成员函数的方式做插入  插入多少个元素都可以自动扩建for (int i = 0; i < 3; i++) {vecData.push_back(i);	  //尾插法 0 01 012}printVector(vecData);
}
int main() {testCreateVector();
}
/*输出*/0        1       2

带长度的创建方式 

确定长度可以直接使用数组法插入→ 在长度范围以内可以直接采用数组法插入,超出的必须要用成员函数插入→ vector subscript out of range (下标超出范围)

//辅助函数:遍历容器
template <class _Ty>
void printVector(vector<_Ty>& temp)
{for (auto v : temp){cout << v << "\t ";}cout << endl;
}void testCreateVector()
{vector<string> strData(3);		//当前动态数组的长度是3for (int i = 0; i < 3; i++)     //确定长度,可以直接使用数组法插入{string name = "name";//只有在确定长度范围以内的才可以直接采用数组法(下标)插入strData[i] = name + to_string(i);}printVector(strData);//strData[3] = "name3";    vector subscript out of range 引发中断strData.push_back("name3");	//超过的必须用成员函数插入(会自动扩增)printVector(strData);
}
int main() {testCreateVector();
}
/*输出*/
name0    name1   name2
name0    name1   name2   name3

带初始化的创建方式 

//辅助函数:遍历容器
template <class _Ty>
void printVector(vector<_Ty>& temp) {for (auto v : temp){cout << v << "\t ";}cout << endl;
}
void testCreateVector() {
//带初始化vector<double> dData = { 1.1,1.23,1.44 };  //自动推断长度为3printVector(dData);
}
int main() {testCreateVector();
}
/*输出*/
1.1      1.23    1.44

vector的其他调用形态 ---> 分配器

自己写内存的申请和释放:特殊的对象需要自己释放内存,管理c语言的文件操作(定义文件指针File* fp 不能用delete释放,必须要调用c语言的free函数释放)-> 单独写一个类当作它的分配器

push_back() 

//辅助函数:遍历容器
template <class _Ty>
void printVector(vector<_Ty>& temp)
{for (auto v : temp){cout << v << "\t ";}cout << endl;
}
int main(){vector<int> intData(3);   intData.push_back(1111); //前面3个值都是垃圾值,在容器中赋值为0在原来内存的后面扩增printVector(intData);	 //push_back()前面的3个元素还在 0 0 0 1111
}  
/*输出*/
0        0       0       1111

遍历方式2→  可以用迭代器做遍历,所有用迭代器遍历都是统一操作 

//迭代器遍历
int main(){vector<int> intData(3);   intData.push_back(1111); vector<int>::iterator iter;for (iter = intData.begin(); iter != intData.end(); iter++) {cout << *iter << "\t";}cout << endl;
}  
/*输出*/
0       0       0       1111

 处理自定义类型数据 ---> 关键点在于重载

 智能指针 → 用对象取代指针的使用方式

 与定长数组的区别:array 管理自定义类型必须要无参构造函数,vector 不需要无参构造函数

//辅助函数:遍历容器
template <class _Ty>
void printVector(vector<_Ty>& temp)
{for (auto v : temp){cout << v << "\t ";}cout << endl;
}//自定义类型数据
class MM 
{
public:MM(string name, int age) :name(name), age(age) {}//重载运算符即可friend ostream& operator<<(ostream& out, const MM& temp) {out << temp.name << "\t" << temp.age;return out;}
protected:string name;int age;
};void testUserData() 
{vector<MM> mmData;    //vector<MM> mmData(3); 带长度的也不需要for (int i = 0; i < 3; i++) {string name = "name";mmData.push_back(MM(name + to_string(i), 18 + i));}//二进制“<<”: 没有找到接受“MM”类型的右操作数的运算符(或没有可接受的转换)printVector(mmData);
}int main() 
{testUserData();return 0;
}

vector 的其他操作 

所有容器都是用迭代器描述位置的,不存在直接的指针操作

//辅助函数:遍历容器
template <class _Ty>
void printVector(vector<_Ty>& temp)
{for (auto v : temp){cout << v << "\t ";}cout << endl;
}void testExOperator() 
{vector<int> iData = { 1,2,3,4 };cout << iData.size() << endl;		//当前容器中的元素个数cout << iData.empty() << endl;		//判断是否为空 return size==0; 有元素返回falsecout << iData.front() << endl;		//访问第一个元素cout << iData.back() << endl;		//访问最后一个元素cout << iData.at(2) << endl;		//直接用下标法访问,返回当前下标下面的值cout << iData[2] << endl;		    //和at(2)一样效果 用于表示元素不能 &iData[2] 没有重载&iData.emplace(iData.begin()+2, 100);/*在指定位置插入一个新的元素,用迭代器去指定位置,传入 的是位置,往第2个位置插入100 */       iData.emplace(iData.begin(), 1111);	//往第一个位置插入元素			printVector(iData);iData.emplace_back(999);			//和 push_back 一样的功能//iData.erase(iData.begin() + 2);   //数组只有伪删除,没有删除操作(万金油函数,链表中有用)printVector(iData);//批量复制 想把一个数组的内容拷贝到一个向量中去--->用迭代器去指定位置int array[] = { 1,2,3 };            //一个普通数组赋值为1,2,3vector<int> vecData;                //不需要起始长度--->构建的是对象,会自动释放vecData.assign(array, array + 3);   /*赋值的方式,把数组中的东西赋值给另一个数组(把元素的第一个位置到最后一个位置拷贝到容器中)*/printVector(vecData);
}
int main() {testExOperator();
}
/*输出*/4
0
1
4
3
3
1111     1       2       100     3       4
1111     1       2       100     3       4       999
1        2       3

empty() 

void testExOperator()
{vector<int> iData;cout << iData.size() << endl;		//当前容器中的元素个数cout << iData.empty() << endl;		//判断是否为空}
int main() {testExOperator();
}
/*输出*/
0
1
http://www.lryc.cn/news/2415971.html

相关文章:

  • Alerter华丽的消息推送栏
  • myeclipse 8.5 注册码
  • vc画线画框画矩形
  • dmscript.dll文件丢失导致程序无法运行问题
  • 2023 抖音\百度\哔哩哔哩热搜热榜单页HTML源码
  • 六祎-实现微信支付宝QQ钱包三块合一收款码
  • 基于Java游戏在线论坛系统的设计与实现(源码+LW+调试文档+讲解等)
  • shsh备份工具_32位设备有SHSH随意降级平刷教程Windows版
  • [0451]基于JAVA的公益林智慧管理系统的设计与实现
  • 淘宝皇冠店铺大全,淘宝最好的皇冠店铺,淘宝皇冠店铺TOP10
  • UVA1585 Score
  • 浏览器判断是否安装了ios/android客户端程序
  • 谷歌翻译浏览器扩展,替换国内服务器版
  • 网络--传输层TCP、UDP、流量控制、拥塞避免、三次挥手
  • 解决windows防火墙无法更改某些设置 错误代码0X800
  • Chart控件---饼图基本用法
  • 快速排序VS堆排序
  • 光棍节程序员闯关秀 小游戏
  • CBrush
  • JavaScript入门:掌握基础语法
  • Free Pascal不完全攻略之一 :进入FP的世界
  • 编程示例:计算1000的阶乘
  • lsass.exe病毒木马手工清除方法
  • CSDN论坛--提问的智慧
  • 微软笔试题《Arithmetic Puzzles》- 题解
  • WPF特效-鱼游动动画3
  • 5分钟了解《代码整洁之道》精华
  • React 核心开发者 Dan Abramov 访谈实录
  • Markdown数学公式语法
  • 入门--什么是机器码、注册机和注册码