十二 C++ STL基础

一 vector

一 实例

#include<iostream>
//1 头文件:<vector>
#include<vector>
#include<string>
using namespace std;
int main() {
    //2 语法:vector<对象类型> 向量名
    vector<string> inventory;
    
    //3 使用向量成员函数:push_back()
     /*作用:在向量最后添加一个新元素*/
    inventory.push_back("sword");
    inventory.push_back("armor");
    inventory.push_back("shield");
    
    //4.1 使用向量成员函数:size()
     /*作用:返回向量的大小*/
    cout<<"You have "<<inventory.size()<<" items.\n";
    
    cout<<"\nYour items:\n"<<endl;
    for(size_t i = 0; i < inventory.size(); ++i)
        cout << inventory[i] << endl;
    
    inventory[0] = "battle axe";
    //4.2 使用向量成员函数:size()
     /*可以使用下标索引*/
    cout<<inventory[0].size()<<endl;
    
    //5 使用向量成员函数:pop_back()
     /*作用:移除向量最后一个元素*/
    inventory.pop_back();
    
    //5 使用向量成员函数:clear()
     /*作用:移除向量全部元素*/
    inventory.clear();
    
    cout<<"You have "<<inventory.size()<<" items.\n";
    
    //5 使用向量成员函数:empty()
     /*作用:判断向量是否为空*/
    if(inventory.empty())
        cout<<"You have nothing."<<endl;
    else
        cout<<"You have at least one item"<<endl;
}

二 要点补充

  1. 向量可以根据需要增长

  2. 声明向量的其它方法:

    //向量初始大小为 10
    vector<string> inventory1(10);
    //向量大小为 10,且全部(10个)元素都初始化为"nothing"
    vector<string> inventory2(10, "nothing");
    //新向量 inventory3 的内容与 向量 myStuff 相同
    vector<string> inventory3(myStuff);

  3. 不可以 使用下标运算符增加向量的大小

    vector<string> inventory;
    inventory[0] = "sword";//可能出错

二 迭代器

一 实例

#include<iostream>
#include<string>
#include<vector>
using namespace std;
int main() {
    vector<string> inventory;
    inventory.push_back("sword");
    inventory.push_back("armor");
    inventory.push_back("shield");
    //1 语法:vector<对象类型>::iterator 迭代器名
    vector<string>::iterator myIterator;
    //2 常量迭代器:不能修改其引用的元素,但自身可以改变
    vector<string>::const_iterator iter;
    
    //3.1 使用向量成员函数:begin()
     /*作用:其返回的迭代器引用容器中的第一个元素*/
    myIterator = inventory.begin();
    
    //4 修改向量元素的值
    *myIterator = "battle axe";
    
    //5 迭代器的解引用
    cout << "\nThe item name '" << *myIterator << "' has";
    cout << myIterator->size() << " letter in it\n" << endl;
    
    //3.2 使用向量成员函数:insert()
     /*作用:将新元素插入至向量中给定 迭代器引用的元素 之前*/
    inventory.insert(inventory.begin() + 1, "crossbow");
    
    //3.3 使用向量成员函数:erase()
     /*作用:移除 迭代器引用的元素*/
    inventory.erase(inventory.begin());
    
    cout << "\nYour items:\n";
    //3.4 使用向量成员函数:end()
     /*作用:其返回向量中❤️最后一个元素之后❤️的迭代器*/
    
    //6 循环访问向量
    for (iter = inventory.begin(); iter != inventory.end(); ++iter)
    	cout << *iter << endl;
}

二 要点补充

  1. 使用 push_back( ) 可能使引用向量的所有迭代器失效

  2. vector 的成员函数 end( ) 返回的迭代器指向向量最后一个元素之后,而不是最后一个元素

  3. 对向量调用 insert( ) 成员函数会使引用了插入点之后的元素的迭代器失效,对向量调用 erase( ) 成员函数同理

三 算法

一 实例

//1 头文件:<algorithm>
#include<algorithm>
#include<iostream>
#include<cstdlib>
#include<vector>
#include<ctime>
using namespace std;
int main() {
	vector<int> Scores;
	Scores.push_back(7);
	Scores.push_back(8);
	Scores.push_back(1);
	Scores.push_back(6);
	vector<int>::const_iterator iter;
	int score;
	cout << "Finding score" << endl;
	cout << "Enter a score to find" << endl;
	cin >> score;
    //2.1 使用 find() 算法
    /*作用:查找目标值*/
    //语法:find(开始位置,结束位置,目标值);
	iter = find(Scores.begin(), Scores.end(), score);
	if (iter != Scores.end())
		cout << "Score found" << endl;
	else
		cout << "Score not found" << endl;
	
    //2.2 使用 random_shuffle() 算法
    /*作用:将序列中的元素进行乱序*/
    //语法:random_shuffle(开始位置,结束位置)
	srand(static_cast<unsigned int>(time(NULL)));
	random_shuffle(Scores.begin(), Scores.end());
	cout << "Your Scores:" << endl;
	for (iter = Scores.begin(); iter != Scores.end(); ++iter)	
		cout << *iter << endl;	
	
    //2.3 使用 sort() 算法
    /*作用:对序列中的元素进行升序的排列*/
	sort(Scores.begin(), Scores.end());
	cout << "Your Scores:" << endl;
	for (iter = Scores.begin(); iter != Scores.end(); ++iter)
		cout << *iter << endl;
}

四 理解向量的性能

一 实例

#include<iostream>
#include<vector>
using namespace std;
int main() {
    vector<int> scores(10, 0);
    cout << "\nScores\n";
    //使用向量成员函数 capacity()
    /*作用:返回向量的容量*/
    cout << "Scores capacity is " << scores.capacity() << endl;//10
    cout << "Scores size is " << scores.size() << endl;//10
    scores.push_back(1);
    //使用向量成员函数 reserve()
	/*作用:将向量的容量扩充至给定实参的大小*/
	//scores.reserve(20);
    cout << "\nScores were added\n";
    cout << "Scores capacity is " << scores.capacity() << endl;//20
    cout << "Scores size is " << scores.size() << endl;//11
}

二 要点补充

  1. 向量的容量和向量的大小(向量容纳的元素的个数)不是一个概念

  2. 使用 reserve() 将向量的容量维持在足够满足需要,这样可以将内存的重新分配推迟到某个选定时刻发生

五 其它 STL 容器

容器类型描述
deque顺序型双向队列
list顺序型线性链表
map关联型键/值对的集合,每个键都与唯一的值关联
multimap关联型键/值对的集合,每个键都可能与多个值关联
multiset关联型元素不一定唯一的集合
priority_queue适配器优先级队列
queue适配器队列
set关联型元素唯一的集合
stack适配器
vector顺序型动态数组

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

维他命C++

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值