一 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;
}
二 要点补充
-
向量可以根据需要增长
-
声明向量的其它方法:
//向量初始大小为 10 vector<string> inventory1(10); //向量大小为 10,且全部(10个)元素都初始化为"nothing" vector<string> inventory2(10, "nothing"); //新向量 inventory3 的内容与 向量 myStuff 相同 vector<string> inventory3(myStuff);
-
不可以 使用下标运算符增加向量的大小
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;
}
二 要点补充
-
使用 push_back( ) 可能使引用向量的所有迭代器失效
-
vector 的成员函数 end( ) 返回的迭代器指向向量最后一个元素之后,而不是最后一个元素
-
对向量调用 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
}
二 要点补充
-
向量的容量和向量的大小(向量容纳的元素的个数)不是一个概念
-
使用 reserve() 将向量的容量维持在足够满足需要,这样可以将内存的重新分配推迟到某个选定时刻发生
五 其它 STL 容器
容器 | 类型 | 描述 |
---|---|---|
deque | 顺序型 | 双向队列 |
list | 顺序型 | 线性链表 |
map | 关联型 | 键/值对的集合,每个键都与唯一的值关联 |
multimap | 关联型 | 键/值对的集合,每个键都可能与多个值关联 |
multiset | 关联型 | 元素不一定唯一的集合 |
priority_queue | 适配器 | 优先级队列 |
queue | 适配器 | 队列 |
set | 关联型 | 元素唯一的集合 |
stack | 适配器 | 栈 |
vector | 顺序型 | 动态数组 |