C++ Primer 学习笔记 Chapter 9

9.1 顺序容器 Sequential Containers

  vector:  快速随机访问,

  list:    快速插入/删除 ,

  deque:  双端队列

9.2 迭代器和迭代器的范围

  迭代器操作:

  *iter:              返回iter指向元素的引用。

  iter->mem:     对iter 进行解引用, 等效于(*iter).mem。

  ++iter和iter++: 给iter加1, 使其指向下一个元素。

  --iter和iter--:  指向下一个元素。

  iter1 == iter2 和 iter1 != iter2  :  两个迭代器是同一容器的同一个元素,或都指向容器超出末端的下一位置时相等。

计算vector对象的中心位置:

  vector<int>::iterator iter = vec.begin() + vec.size() / 2;

list 容器不支持迭代器的算术操作

Exercises Section 9.2

  Exercise 9.7 :以下代码编译出错, list的 iterator 不支持 关系运算符操作

list<int> lst1;
list<int>::iterator iter1 = lst1.begin(),
iter2 = lst1.end();
while (iter1 < iter2) {
  break;
}

  Exercise 9.8:当iterator的字符串为空时,执行if内语句

  Exercise 9.8:Write a loop to write the elements of a list reverse order.

#include <iostream>
#include <list>
#include <vector>
#include <sstream>

using namespace std;

void exercize_9_9();

int main() {
  exercize_9_9();
  return 0;
}

void exercize_9_9() {
  list<string> list1 ;
  for (short i = 0; i < 10; ++i) {
    stringstream ss;
    ss << i;
    list1.push_back("string " + ss.str());
  }

  list<string>::iterator it = list1.end();
  do
  {
    --it;
    string s = *it;
    cout << s.c_str() << endl;
  }
  while (it != list1.begin());
}

  Exercise 9.10: Which, if any , of the following iterator uses are in error?

const vector< int > ivec(10);
vector< string > svec(10);
list< int > ilist(10);
(a) vector<int>::iterator it = ivec.begin(); //错误:ivec中的迭代器是const,改成vector<int>::const_iterator(b) list<int>::iterator it = ilist.begin()+2; //错误:list 中的迭代器不能进行算术加减运算 (c) vector<string>::iterator it = &svec[0]; //错误:svec[0],是字符型string。(d) for (vector<string>::iterator it = svec.begin(); it != 0; ++it) //错误, it != 0改为 it != svec.end()  //....
时间: 2024-10-10 06:50:08

C++ Primer 学习笔记 Chapter 9的相关文章

C++primer学习笔记(二)——Chapter 4

4.1  Fundamentals 1.Basic Concepts (1)操作符分为一元,二元或者三元操作符: (2)复杂的表达式中含有很多操作符时: 规则一:分为不同的级别,级别高的先运行: 规则二:相同级别的操作符有执行顺序的确定: (3)操作符可以改变操作数的类型 一般将级别低的转化成级别高的 (4)重载运算符 相同的运算符在对不同类型的对象进行操作的时候,会有不同的功能: (5)Lvalue和Rvalue 显而易见:Lvalue指的是Left value,Rvalue指的是Right

C++primer学习笔记(一)——Chapter 3

3.1 Namespace using Declarations 1.因为C++里有名字空间的定义,例如我们使用cin的时候必须写成std::cin,如果就用一次还是可以接受的,但是如果一直都这样,那就很麻烦了.所以C++使用了一个姓的关键字using. (1)第一种用法: 例如:using namespace std; 这样子的话就可以使用std名字空间下面所有的方法而不用加std::. (2)第二种用法: 例如:using std::cin; 这样子的就只能cin前面不加std::,而其他的

C++ Primer 学习笔记_98_特殊工具与技术 --优化内存分配

特殊工具与技术 --优化内存分配 引言: C++的内存分配是一种类型化操作:new为特定类型分配内存,并在新分配的内存中构造该类型的一个对象.new表达式自动运行合适的构造函数来初始化每个动态分配的类类型对象. new基于每个对象分配内存的事实可能会对某些类强加不可接受的运行时开销,这样的类可能需要使用用户级的类类型对象分配能够更快一些.这样的类使用的通用策略是,预先分配用于创建新对象的内存,需要时在预先分配的内存中构造每个新对象. 另外一些类希望按最小尺寸为自己的数据成员分配需要的内存.例如,

C++ Primer 学习笔记_73_面向对象编程 --再谈文本查询示例

面向对象编程 --再谈文本查询示例 引言: 扩展第10.6节的文本查询应用程序,使我们的系统可以支持更复杂的查询. 为了说明问题,将用下面的简单小说来运行查询: Alice Emma has long flowing red hair. Her Daddy says when the wind blows through her hair, it looks almost alive, like a fiery bird in flight. A beautiful fiery bird, he

C++ Primer 学习笔记_74_面向对象编程 --再谈文本查询示例[续/习题]

面向对象编程 --再谈文本查询示例[续/习题] //P522 习题15.41 //1 in TextQuery.h #ifndef TEXTQUERY_H_INCLUDED #define TEXTQUERY_H_INCLUDED #include <iostream> #include <fstream> #include <sstream> #include <vector> #include <set> #include <map&g

C++ Primer 学习笔记_19_类与数据抽象(5)_初始化列表(const和引用成员)、拷贝构造函数

C++ Primer 学习笔记_19_类与数据抽象(5)_初始化列表(const和引用成员).拷贝构造函数  从概念上将,可以认为构造函数分为两个阶段执行: 1)初始化阶段: 2)普通的计算阶段.计算阶段由构造函数函数体中的所有语句组成. 一.构造函数初始化列表 推荐在构造函数初始化列表中进行初始化 1.对象成员及其初始化 <span style="font-size:14px;">#include <iostream> using namespace std;

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 学习笔记_104_特殊工具与技术 --嵌套类

特殊工具与技术 --嵌套类 可以在另一个类内部(与后面所讲述的局部类不同,嵌套类是在类内部)定义一个类,这样的类是嵌套类,也称为嵌套类型.嵌套类最常用于定义执行类. 嵌套类是独立的类,基本上与它们的外围类不相关,因此,外围类和嵌套类的对象是互相独立的.嵌套类型的对象不具备外围类所定义的成员,同样,外围类的成员也不具备嵌套类所定义的成员. 嵌套类的名字在其外围类的作用域中可见,但在其他类作用域或定义外围类的作用域中不可见.嵌套类的名字将不会与另一作用域中声明的名字冲突 嵌套类可以具有与非嵌套类相同