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



标准库类型(二)

--vector类型

引子:

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

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

[cpp] view plaincopyprint?

  1. #include <vector>
  2. using std::vector;
#include <vector>
using std::vector;

【模板】

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

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

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

正文:

1、vector对象的定义和初始化

[cpp] view plaincopyprint?

  1. //vector的四种初始化方式
  2. vector<T> v1;
  3. vector<T> v2(v1);
  4. vector<T> v3(n,i);
  5. vector<T> v4(n);
	//vector的四种初始化方式
	vector<T> v1;
	vector<T> v2(v1);
	vector<T> v3(n,i);
	vector<T> v4(n);

示例:

[cpp] view plaincopyprint?

  1. vector<int> ivec1;
  2. vector<int> ivec2(ivec1);
  3. /*
  4. *ERROR
  5. *vector<string> strVec(ivec2);
  6. */
  7. vector<int> ivec3(10,-1);
  8. 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?

  1. //P80 习题3.11 下面语句正确or错误?
  2. vector<vector<int>> ivec;           //在C++11中正确,在C++98/03中错误
  3. vector< vector<int> > ivec;             //正确
  4. 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?

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

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

[cpp] view plaincopyprint?

  1. int main()
  2. {
  3. string word;
  4. unsigned count = 0;
  5. vector<string> strVec;
  6. while (cin >> word)
  7. {
  8. ++ count;
  9. strVec.push_back(word);
  10. }
  11. if (count == strVec.size())
  12. {
  13. cout << "Equal!" << endl;
  14. }
  15. //C++程序员应习惯于用 != 来限定循环的约束条件
  16. for (vector<string>::size_type index = 0; index != strVec.size(); ++index)
  17. {
  18. cout << strVec[index] << endl;
  19. }
  20. return 0;
  21. }
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?

  1. vector<int> ivec;
  2. for (vector<int>::size_type index = 0; index != 10; ++index)
  3. {
  4. /*
  5. *必须是已经存在的元素才能使用下标操作符进行索引
  6. *通过下标操作符进行赋值时,并不会添加任何元素
  7. *ivec[index] = index + 1; ERROR
  8. */
  9. ivec.push_back(index + 1);
  10. }
  11. for (vector<int>::size_type index = 0; index != ivec.size(); ++index)
  12. {
  13. cout << ivec[index] << endl;
  14. }
  15. for (vector<int>::size_type index = 0; index != ivec.size(); ++index)
  16. {
  17. //对于已经存在的元素
  18. ivec[index] = 333;
  19. }
  20. for (vector<int>::size_type index = 0; index != ivec.size(); ++index)
  21. {
  22. cout << ivec[index] << endl;
  23. }
    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?

  1. //P83 习题3.13 (1)
  2. int main()
  3. {
  4. freopen("input.txt","r",stdin);
  5. vector<int> ivec;
  6. int value;
  7. while (cin >> value)
  8. {
  9. ivec.push_back(value);
  10. }
  11. for (vector<int>::size_type index = 0; index < ivec.size() - 1; index += 2)
  12. {
  13. cout << ivec[index] + ivec[index + 1] << endl;
  14. }
  15. if (ivec.size() % 2)
  16. {
  17. cout << "The last element " << ivec[ivec.size() - 1]
  18. << " is not been summed!" << endl;
  19. }
  20. return 0;
  21. }
//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?

  1. //(2)
  2. int main()
  3. {
  4. freopen("input.txt","r",stdin);
  5. vector<int> ivec;
  6. int value;
  7. while (cin >> value)
  8. {
  9. ivec.push_back(value);
  10. }
  11. vector<int>::size_type length = ivec.size();
  12. cout << "Length is: " << length << endl;
  13. for (vector<int>::size_type index = 0; index < ivec.size()/2; ++index)
  14. {
  15. cout << ivec[index] + ivec[ivec.size() - 1 - index] << endl;
  16. }
  17. if (ivec.size() % 2)
  18. {
  19. cout << "The center element " << ivec[ivec.size() / 2]
  20. << " is not been summed!" << endl;
  21. }
  22. return 0;
  23. }
//(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?

  1. //习题3.14
  2. int main()
  3. {
  4. freopen("input.txt","r",stdin);
  5. string word;
  6. vector<string> strVec;
  7. while (cin >> word)
  8. {
  9. strVec.push_back(word);
  10. }
  11. for (vector<string>::size_type i = 0;i != strVec.size(); ++i)
  12. {
  13. for (string::size_type j = 0;j != strVec[i].size(); ++j)
  14. {
  15. strVec[i][j] = toupper(strVec[i][j]);
  16. }
  17. }
  18. for (vector<string>::size_type index = 0;index != strVec.size(); ++index)
  19. {
  20. cout << strVec[index] << ‘ ‘;
  21. if (!((index+1) % 8))
  22. {
  23. cout << endl;
  24. }
  25. }
  26. return 0;
  27. }
时间: 2024-10-10 14:07:20

C++ Primer 学习笔记_7_标准库类型(续1) -- vector类型的相关文章

C++ Primer 学习笔记_8_标准库类型(续2) -- iterator

 标准库类型(三) --iterator 序言: 迭代器是一种检查容器内元素并遍历容器元素的数据类型. 所有的标准库容器都定义了相应的迭代器类型,而只有少数的容器支持下标操作:因此,现代C++更倾向于使用迭代器而不是下标操作访问容器元素. 正文: 1.容器的iterator类型 每个标准库容器类型都定义了一个名为iterator的成员: [cpp] view plaincopyprint? vector<int>::iterator iter; vector<int>::ite

C++ Primer 学习笔记_9_标准库类型(续3) -- biteset

 标准库类型(四) --biteset 序言: 位是用来保存一组项或条件的yes/no信息[标识]的简洁方法. [cpp] view plaincopyprint? #include <bitset> using std::bitset; #include <bitset> using std::bitset; 正文: 1.bitset对象的定义和初始化 和vector对象不同的是:bitset类型对象的区别在于其长度而不是类型.在定义bitest时,要在尖括号中说明给出他的长

C++ Primer 学习笔记_6_标准库类型 -- 命名空间using与string类型

 标准库类型(一) --命名空间using与string类型 引: 标准库类型是语言组成部分中更基本的哪些数据类型(如:数组.指针)的抽象! C++标准库定义的是高级的抽象数据类型: 1.高级:因为其中反映了更复杂的概念: 2.抽象:因为我们在使用时不需要关心他们是如何表示的,我们只需要知道这些抽象数据类型支持哪些操作就可以了. 正文: 一.命名空间的using声明 1. using std::cin; ::运算符的作用含义是右操作数的名字可以在左操作数的作用域中找到. 格式: [cpp]

C++ Primer(第五版)学习笔记_7_标准模板库_multiset多重集合容器

C++ Primer(第五版)学习笔记_7_标准模板库_multiset多重集合容器 多重集合容器multiset与set一样,也是使用红黑树来组织元素数据的,唯一不用的是,multiset允许重复的元素键值插入.其结构示意图如下: 1.multiset元素插入 #include <iostream> #include <stdio.h> #include <vector> #include <set> #include <string> usi

C++ Primer 学习笔记_11_标准模板库_stack、queue队列容器与priority_queue优先队列容器

C++ Primer 学习笔记_11_标准模板库_stack.queue队列容器与priority_queue优先队列容器 1.stack堆栈 stack堆栈是一个后进先出(Last In First Out,LIFO)的线性表,插入和删除元素都只能在表的一端进行.插入元素的一端称为栈顶,而另一端称为栈底.插入元素叫入栈(Push),删除元素叫出栈(Pop).下图是堆栈示意图 堆栈只提供入栈,出栈,栈顶元素访问和判断是否为空等几种方法.采用push()方法将元素入栈:采用pop()方法出栈:采用

C++ Primer 学习笔记_14_标准模板库_bitset位集合容器

C++ Primer 学习笔记_14_标准模板库_bitset位集合容器 bitset容器是一个bit位元素的序列容器,每个元素只占一个bit位,取值为0或1,因而很节省内存空间.下图是一个bitset的存储示意图,它的10个元素只使用了两个字节的空间. 使用bitset需要声明头文件"#include <bitset>" 1.创建bitset对象 创建bitset对象时,必须要指定容器的大小.bitset对象的大小一经定义,就不能修改了.下面这条语句就定义了bitset对

C++ Primer 学习笔记_23_标准模板库_stack.

C++ Primer 学习笔记_11_标准模板库_stack.queue队列容器与priority_queue优先队列容器 1.stack堆栈 stack堆栈是一个后进先出(Last In First Out,LIFO)的线性表,插入和删除元素都只能在表的一端进行.插入元素的一端称为栈顶,而另一端称为栈底.插入元素叫入栈(Push),删除元素叫出栈(Pop).下图是堆栈示意图 堆栈只提供入栈,出栈,栈顶元素访问和判断是否为空等几种方法.采用push()方法将元素入栈:采用pop()方法出栈:采用

C++ Primer 学习笔记_13_标准模板库_list双向链表容器

C++ Primer 学习笔记_13_标准模板库_list双向链表容器 list容器实现了双向链表的数据结构,数据元素是通过链表指针串连成逻辑意义上的线性表,这样,对链表的任一位置的元素进行插入.删除和查找都是超快速的.下图是双向循环链表的结构示意图. list的每个节点有三个域:前驱元素指针域.数据域和后继元素指针域.前驱元素指针域保存了前驱元素的首地址:数据域则是本节点的数据:后继元素指针域则保存了后继元素的首地址.list的头结点的前驱元素指针域保存的是链表中尾元素的首地址,而list的尾

C++ Primer 学习笔记_10_标准模板库_map和set的对比

C++ Primer 学习笔记_10_标准模板库_map和set的对比   set multiset 创建 set<int> str multiset<string> str 插入 str.insert(8) str.insert("abc") 遍历 set<int>::iterator iter multiset< string >::iterator iter 输出 *iter *iter 删除 n = str.erase(8) 删除