顺序容器(1):vector
1.容器与顺序容器
容器:特定类型对象的集合。
顺序容器:提供 控制 对集合里的 元素 存储和访问 顺序 (这种顺序与元素加入容器时的位置相对应)的能力。
有:vector,deque,list,front_list,array,string 。
准确的说是:vector 等是一个类模板,本身不是类,应该先指出将其实例化为何种类型(如:vector<int> ivec),下面为了描述简单,将其默认为已经实例化了的类型。
2.顺序容器之迭代器
下标运算可以访问stirng和vector对象。迭代器 也可以实现这个目的,但是迭代器更为通用,因为所有的标准库容器都支持迭代器。
怎么声明:举例:vector<int> :: iterator it;
怎么使用:类似于指针,提供对对象的间接访问。
*it, it->mem,++it,--it,it1 = it2, it1 != it2;
注意:"与指针不同的是,获取迭代器使用的不是取地址符,有迭代器的类型 同时 拥有 返回迭代器的成员" --《c++primer》
例如:auto a = v.begin(); auto b = v.end();
v 是有某种迭代器的类型(vector,deque,list,front_list,array,string 有迭代器,int, double 等没有迭代器)。
begin(), end()是该类型的成员(而且这两个成员函数返回迭代器)。使得a和b能够对对象v进行操作。
细节:begin() 和 end () 这对迭代器 对对象 v 的界定是 左闭右开区间,即a 指向 v 的最左端元素的位置, b 指向v 的最右端元素的下一个位置。
3.vector:是什么,能干什么,怎么干的,优缺点
vector是类模板vector<T>,可实例化为vector<int>等。
能比array灵活,是可变大小的array。
定义和初始化(以int 为例,也可以是double ,string等):
vector <int> a;
vector <int> b = a; 或 vector <int> b (a)
vector <int> c = ( n ,i); // 圆括号表示 提供的值是用来构造 vector 对象的,这里表示c 为 n 个 i 的集合。
vector <int> c = {......}; // 花括号表示 列表初始化,
支持的操作:v.empty(), v.size(),v.push_back(), v[n],.......
4. C11 新特性之 for(declaration : expression) statement
expression:一个对象,表示一个序列
declaration :一个变量,访问序列中的基础元素。每次迭代会被初始化为 expression 部分的下一个元素值。
注意:
例子1:
string str("some string"); // 输出str中的每个字符 for (auto c : str) cout << c <<endl;
得到的输出为:some string
例子2:
1 string word; // 隔行输出str中的每个字符,,键入 asdf g h jkl; 2 3 vector<string> str; 4 5 while (cin >> word) 6 str.push_back(word); 7 8 for (auto c : str) 9 10 cout << c <<endl;
得到的输出为:
asdf
g
h
jkl;
并没有按预期的隔行输出键入的字符串的每个字符,关键在:declaration :一个变量,访问序列中的基础元素。
例1 中这个expression 为string ,则其基础元素为单个字符。
例2 中这个expression 为vector<string>,则其基础元素为string(字符串)。
附:
vector 能容纳大多数类型的对象作为其元素,(但是 引用 不是对象,所以不存在包含引用的vector。)
除此之外,绝大多数内置类型和类类型都可以构成vector对象、
vector<vector<int>> a; // 向量 a 的元素是 vector 对象。
在使用 vector<vector<int>> a 时3,不能像二位数组那样用a[i][j]对其进行直接赋值,因为他是个二维向量,其里层为一个容纳int 的vector ,先给vector<int> 赋值后,再给 a(即 vector<vector<int>> a) 进行赋值.
vector<vector<int>> a; vector<int> v; for (int i = 0; i<n; i++) { // n 为 向量的维度 v.clear(); // 每次都要 clear() for (int j = 0; j < n; j++) { cin >> temp; v.push_back(temp); } test.push_back(v); }

浙公网安备 33010602011771号