标准库类型(二)
--vector类型
引子:
vector是同一种类型的对象的集合,每个对象都有一个对应的整数索引值。和string对象一样,标准库将负责管理与存储元素相关的内存。
我们将vector称之为容器,一个容器中的所有对象都必须是同一类型的!
[cpp] view plaincopyprint?
- #include <vector>
- using std::vector;
#include <vector> using std::vector;
【模板】
vector就是一个类模板,使用模板可以编写一个类定义或函数定义,而用于多个不同的数据类型!
但是,声明从类模板产生的某种类型的对象,需要提供附加信息。如:
vector并不是一种数据类型,而vector<string>,vector<int>都是数据类型!
正文:
1、vector对象的定义和初始化
[cpp] view plaincopyprint?
- //vector的四种初始化方式
- vector<T> v1;
- vector<T> v2(v1);
- vector<T> v3(n,i);
- vector<T> v4(n);
//vector的四种初始化方式 vector<T> v1; vector<T> v2(v1); vector<T> v3(n,i); vector<T> v4(n);
示例:
[cpp] view plaincopyprint?
- vector<int> ivec1;
- vector<int> ivec2(ivec1);
- /*
- *ERROR
- *vector<string> strVec(ivec2);
- */
- vector<int> ivec3(10,-1);
- vector<string> strVec(10,"HI");
vector<int> ivec1; vector<int> ivec2(ivec1); /* *ERROR *vector<string> strVec(ivec2); */ vector<int> ivec3(10,-1); vector<string> strVec(10,"HI");
2、vector对象的值初始化
1)如果vector对象保存的是内置数据类型(如:int),那么标准库将用0值创建元素初始化式。
2)如果vector保存的是含有构造函数的类类型的元素,那么标准库将用该类型的默认构造函数创建元素初始化式。
*3)如果vector保存的类类型元素没有默认构造函数,程序员就不能仅提供元素个数,还要提供初始值。
3、vector对象的动态增长
因为vector的增长效率非常高,所以,当元素值已知时,最好是通过动态的向它添加元素来让他“成长^_^”.
【P79关键概念:vector对象的动态增长非常C/Java及其他程序员一读,推荐】
[cpp] view plaincopyprint?
- //P80 习题3.11 下面语句正确or错误?
- vector<vector<int>> ivec; //在C++11中正确,在C++98/03中错误
- vector< vector<int> > ivec; //正确
- vector<string> svec(10,"NULL"); //正确
//P80 习题3.11 下面语句正确or错误? vector<vector<int>> ivec; //在C++11中正确,在C++98/03中错误 vector< vector<int> > ivec; //正确 vector<string> svec(10,"NULL"); //正确
4、vector对象的size
成员函数size返回相应的vector类定义的size_type的值。
[cpp] view plaincopyprint?
- vector<int>::size_type length = st.size(); //正确
- vector::size_type lenth; //错误
vector<int>::size_type length = st.size(); //正确 vector::size_type lenth; //错误
5、push_back()操作接受一个元素值。
[cpp] view plaincopyprint?
- int main()
- {
- string word;
- unsigned count = 0;
- vector<string> strVec;
- while (cin >> word)
- {
- ++ count;
- strVec.push_back(word);
- }
- if (count == strVec.size())
- {
- cout << "Equal!" << endl;
- }
- //C++程序员应习惯于用 != 来限定循环的约束条件
- for (vector<string>::size_type index = 0; index != strVec.size(); ++index)
- {
- cout << strVec[index] << endl;
- }
- return 0;
- }
int main() { string word; unsigned count = 0; vector<string> strVec; while (cin >> word) { ++ count; strVec.push_back(word); } if (count == strVec.size()) { cout << "Equal!" << endl; } //C++程序员应习惯于用 != 来限定循环的约束条件 for (vector<string>::size_type index = 0; index != strVec.size(); ++index) { cout << strVec[index] << endl; } return 0; }
【P82关键概念:安全的泛型编程 推荐阅读!】
6、下标操作不添加元素!
[cpp] view plaincopyprint?
- vector<int> ivec;
- for (vector<int>::size_type index = 0; index != 10; ++index)
- {
- /*
- *必须是已经存在的元素才能使用下标操作符进行索引
- *通过下标操作符进行赋值时,并不会添加任何元素
- *ivec[index] = index + 1; ERROR
- */
- ivec.push_back(index + 1);
- }
- for (vector<int>::size_type index = 0; index != ivec.size(); ++index)
- {
- cout << ivec[index] << endl;
- }
- for (vector<int>::size_type index = 0; index != ivec.size(); ++index)
- {
- //对于已经存在的元素
- ivec[index] = 333;
- }
- for (vector<int>::size_type index = 0; index != ivec.size(); ++index)
- {
- cout << ivec[index] << endl;
- }
vector<int> ivec; for (vector<int>::size_type index = 0; index != 10; ++index) { /* *必须是已经存在的元素才能使用下标操作符进行索引 *通过下标操作符进行赋值时,并不会添加任何元素 *ivec[index] = index + 1; ERROR */ ivec.push_back(index + 1); } for (vector<int>::size_type index = 0; index != ivec.size(); ++index) { cout << ivec[index] << endl; } for (vector<int>::size_type index = 0; index != ivec.size(); ++index) { //对于已经存在的元素 ivec[index] = 333; } for (vector<int>::size_type index = 0; index != ivec.size(); ++index) { cout << ivec[index] << endl; }
7、试图获取不存在的元素必然导致运行时错误,但是,不能确保执行过程中可以捕捉到这类错误!
程序运行时总会以某种有趣的方式失败@[email protected]
[cpp] view plaincopyprint?
- //P83 习题3.13 (1)
- int main()
- {
- freopen("input.txt","r",stdin);
- vector<int> ivec;
- int value;
- while (cin >> value)
- {
- ivec.push_back(value);
- }
- for (vector<int>::size_type index = 0; index < ivec.size() - 1; index += 2)
- {
- cout << ivec[index] + ivec[index + 1] << endl;
- }
- if (ivec.size() % 2)
- {
- cout << "The last element " << ivec[ivec.size() - 1]
- << " is not been summed!" << endl;
- }
- return 0;
- }
//P83 习题3.13 (1) int main() { freopen("input.txt","r",stdin); vector<int> ivec; int value; while (cin >> value) { ivec.push_back(value); } for (vector<int>::size_type index = 0; index < ivec.size() - 1; index += 2) { cout << ivec[index] + ivec[index + 1] << endl; } if (ivec.size() % 2) { cout << "The last element " << ivec[ivec.size() - 1] << " is not been summed!" << endl; } return 0; }
[cpp] view plaincopyprint?
- //(2)
- int main()
- {
- freopen("input.txt","r",stdin);
- vector<int> ivec;
- int value;
- while (cin >> value)
- {
- ivec.push_back(value);
- }
- vector<int>::size_type length = ivec.size();
- cout << "Length is: " << length << endl;
- for (vector<int>::size_type index = 0; index < ivec.size()/2; ++index)
- {
- cout << ivec[index] + ivec[ivec.size() - 1 - index] << endl;
- }
- if (ivec.size() % 2)
- {
- cout << "The center element " << ivec[ivec.size() / 2]
- << " is not been summed!" << endl;
- }
- return 0;
- }
//(2) int main() { freopen("input.txt","r",stdin); vector<int> ivec; int value; while (cin >> value) { ivec.push_back(value); } vector<int>::size_type length = ivec.size(); cout << "Length is: " << length << endl; for (vector<int>::size_type index = 0; index < ivec.size()/2; ++index) { cout << ivec[index] + ivec[ivec.size() - 1 - index] << endl; } if (ivec.size() % 2) { cout << "The center element " << ivec[ivec.size() / 2] << " is not been summed!" << endl; } return 0; }
[cpp] view plaincopyprint?
- //习题3.14
- int main()
- {
- freopen("input.txt","r",stdin);
- string word;
- vector<string> strVec;
- while (cin >> word)
- {
- strVec.push_back(word);
- }
- for (vector<string>::size_type i = 0;i != strVec.size(); ++i)
- {
- for (string::size_type j = 0;j != strVec[i].size(); ++j)
- {
- strVec[i][j] = toupper(strVec[i][j]);
- }
- }
- for (vector<string>::size_type index = 0;index != strVec.size(); ++index)
- {
- cout << strVec[index] << ‘ ‘;
- if (!((index+1) % 8))
- {
- cout << endl;
- }
- }
- return 0;
- }