01~C++标准模板库/STL 基础

本文深入探讨了STL中的容器vector的特性与应用,包括动态内存管理、迭代器操作、成员函数使用及非成员算法的配合。通过具体示例展示了vector如何进行初始化、元素访问、迭代器遍历、成员函数调用以及算法辅助处理。此外,还介绍了基于范围的for循环结构在C++11中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

STL 提供了一组表示 容器 迭代器 函数对象和算法的模板

1、容器 - vertor
vector 是一个与数组类似的单元,示例,vector访问形式如同数组

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

int const NUM = 5;

int main() {
//类比一个包含NUM个int 元素的数组
vector<int> ratings(NUM);
//类比一个包含NUM个string元素的数组
vector<string> titles(NUM);
//上面两个接口可见,容器使用动态内存分配

cout << "Your will do exactly as told , You will enter:" << endl;
int cnt = 0;
for(;cnt < NUM;cnt++) {
	cout << "Enter title for #" << cnt + 1 << ':' <<  endl;
	getline(cin,titles[cnt]);
	cout << "Enter your ratings [0-9]:" << endl;
	cin >> ratings[cnt];
	cin.get(); //discard \n
}

//int cnt;
for(cnt=0;cnt < NUM; cnt++) {
	cout << ratings[cnt] << '\t' << titles[cnt] << endl;
}
return 0;
}

2、vector 迭代器 与vector 成员函数方法
本质上是一个广义指针。可以使用解引用运算和递增运算(如同指针)
语法实现上是一个名称为iterator的typedef,形如
template< typename T>
class vector {
public:
typedef T* iterator;
}
示例代码:

#include <vector>
#include <string>
#include <iostream>
using namespace std;
#define NUM 3
int main(void) {
//vector 类比数组
vector<double> nums(NUM);
//iterator 类比成员类型指针
vector<double>::iterator pd;
/*使用自动类型推断
auto pd = nums.begin();*/
//init nums ,使用数组的形式访问
int cnt = 0;
for(;cnt < NUM;cnt++) {
	cin >> nums[cnt];
}

//print nums.使用迭代器,指针的形式访问
cnt = 0;
/*左闭 右开区间 [), {0  1 2 NULL} */
for(pd = nums.begin();pd < nums.end();pd++) {
	cout << "#" << cnt++ << ':' << *pd << endl;
}

cout << "nums size = " << nums.size() << endl;

//push a new mem to vector end, size = 4.  {0 1 2 3 NULL}
nums.push_back(100);
cout << "after push one nums size = " << nums.size() << endl;

/*erase (p1,p2), erase range[p1, p2)*/
nums.erase(nums.begin(), nums.begin() + 2); 
cout << "after push one nums size = " << nums.size() << endl; //size =2
cout << nums[0] << endl; //?
cout <<nums[1] << endl; //100

/*insert (old, new1 , new2) [new, new2),插入到old前面*/
vector<double> tmp(2);
tmp[0] = 200;
tmp[1] = 300;
nums.insert(nums.begin(),tmp.begin(),tmp.end());
cout << nums[0] <<endl; //200

return 0;
}

3、容器与非成员方法函数

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
struct A {
public:
	A (int i = 0) : m_int(i){}
int m_int;
};
/*begin 返回类型具有常属性*/
void print_A(A const &that) {
cout << that.m_int << endl;
}
int main() {
/*遍历容器的手动方法, begin retval const*/
 vector<int> arr(4);
 auto pi = arr.begin();
 for(;pi < arr.end();pi++) {
 	print_A(*pi);
 }

arr[0] = 2;
arr[1] = 1;
arr[3] = 3;
arr[2] = 0;

/*区间 apply 函数*/
for_each(arr.begin(), arr.end(),print_A);

/*sort 升序*/
sort(arr.begin(), arr.end());
for_each(arr.begin(), arr.end(),print_A);

/*random 排序*/
random_shuffle(arr.begin(), arr.end());
for_each(arr.begin(), arr.end(),print_A);

return 0;
}

4 基于范围的for循环结构 -std=c++11

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;
int main() {
double prices[5] = {10,20,30,40,50};
for(double x: prices){
cout << x << endl;
}

vector<double> nums(3);
nums[0] = 1;
nums[1] = 2;
nums[2] = 3;

for(auto x : nums) cout << x << endl;
return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值