STL
#include <vector>
结合了数组和链表的特点
内部实现:使用数组!
动态性:可以进行插入和删除操作,在末尾操作简单,在中间操作较困难(因为是数组!)
int main() {
vector<string> v(2, "abc"); // "abc", "abc"
v.pop_back(); // "abc"
v.push_back("de"); // "abc", "de"
v.push_back("fg"); // "abc", "de", "fg"
v.insert(v.end(), "hi"); // "abc", "de", "fg", "hi"
auto it1 = v.begin(); // 迭代器指向第一个元素: "abc"
auto it2 = v.end(); // 迭代器指向(最后一个元素的)后面!
++it1; --it2; // it1 -> "de" it2 -> "fg"
v.erase(it1, it2); // "abc", "hi"
}
删除或插入中间元素时必须移动所有后续元素 → 速度慢! 需要使用迭代器(而非索引) insert 操作也是如此(需要移动元素,速度慢)
数据结构:vector
使用 [] 或 at() 进行访问
v[1000] = 10;
try {
v.at(1000) = 10;
}
catch (out_of_range& e) {
cout << "caught " << e.exception::what() << endl;
}
使用 []:不进行边界检查!→ 可能导致程序崩溃或出现其他不可预料的行为! → 但因此访问速度更快(通过指针算术实现) 使用 at(): 会检查索引的有效性。 因此比 [] 操作慢。 如果索引超出有效范围,则抛出异常。 at() 返回一个引用,因此可以进行赋值操作。 但赋值操作当然只能针对有效的索引进行。 使用 push_back() 或 insert() 进行插入。 调用基类 exception 的 what() 方法。what() 返回一个“解释性”的字符串。
通过迭代器访问:vector::iterator
// 使用基于范围的for循环("for each"循环):更简单
void print(vector<string> & v){
for (string s: v)
cout << s << "->";
cout << "." << endl;
}
// 使用迭代器:像指向vector元素的指针
void print2(vector<string> & v){
vector<string>::iterator it = v.begin();
// 或者:auto it = v.begin(); (推荐,更简洁)
while (it != v.end()){
cout << *it << "->"; // 访问迭代器所指向的元素
++it; // 将迭代器向前移动一个元素
}
cout << "." << endl;
}
基于范围的for循环 (for each):使用更简单。 迭代器:行为类似于指向vector中各个元素的指针。 auto关键字:由编译器自动推断变量的数据类型。在处理复杂的数据类型时非常有用。
—— 本文来自火龙信奥(义乌睿码科技):义乌青少年信息学奥赛与编程教育平台,专注 CSP-J/S、NOIP、GESP 竞赛培训,线上线下融合教学,助力编程升学。网址:hlcoding.com