C++ Primer 学习笔记_7_标准库部类(续1) - vector类型

C++ Primer 学习笔记_7_标准库类型(续1) -- vector类型

标准库类型(二)

--vector类型



引子:

    vector是同一种类型的对象的集合,每个对象都有一个对应的整数索引值。和string对象一样,标准库将负责管理与存储元素相关的内存。

    我们将vector称之为容器,一个容器中的所有对象都必须是同一类型的!

#include <vector>
using std::vector;

【模板】

    vector就是一个类模板,使用模板可以编写一个类定义或函数定义,而用于多个不同的数据类型!

    但是,声明从类模板产生的某种类型的对象,需要提供附加信息。如:

       vector并不是一种数据类型,而vector<string>,vector<int>都是数据类型!



正文:

1vector对象的定义和初始化

	//vector的四种初始化方式
	vector<T> v1;
	vector<T> v2(v1);
	vector<T> v3(n,i);
	vector<T> v4(n);

示例:

    vector<int> ivec1;
    vector<int> ivec2(ivec1);
    /*
    *ERROR
    *vector<string> strVec(ivec2);
    */

    vector<int> ivec3(10,-1);
    vector<string> strVec(10,"HI");

2vector对象的值初始化

    1)如果vector对象保存的是内置数据类型(如:int),那么标准库将用0值创建元素初始化式。

    2)如果vector保存的是含有构造函数的类类型的元素,那么标准库将用该类型的默认构造函数创建元素初始化式。

   *3)如果vector保存的类类型元素没有默认构造函数,程序员就不能仅提供元素个数,还要提供初始值。



3vector对象的动态增长

    因为vector的增长效率非常高,所以,当元素值已知时,最好是通过动态的向它添加元素来让他“成长^_^”.

P79关键概念:vector对象的动态增长非常C/Java及其他程序员一读,推荐】

//P80 习题3.11 下面语句正确or错误?
	vector<vector<int>> ivec;			//在C++11中正确,在C++98/03中错误
	vector< vector<int> > ivec;		        //正确
	vector<string> svec(10,"NULL");	                //正确

4vector对象的size

    成员函数size返回相应的vector类定义的size_type的值。

	vector<int>::size_type length = st.size();	//正确
	vector::size_type lenth;			//错误

5push_back()操作接受一个元素值。

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、下标操作不添加元素!

    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、试图获取不存在的元素必然导致运行时错误,但是,不能确保执行过程中可以捕捉到这类错误!

程序运行时总会以某种有趣的方式失败@_@

//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;
}

//(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;
}

//习题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;
}