循环删除vector和map中的元素
删除所有偶数项,并打印出删除的项
1. vector/queue
正确方法1:
void erase(vector<int> &v)
{
for(vector<int>::iterator vi=();vi!=();)
{
if(*vi % 2 == 0)
{
cout << "Erasing " << *vi << endl;
vi = (vi);
}
else ++vi;
}
}
正确方法2:
void erase2(vector<int> &v)
{
for(vector<int>::reverse_iterator ri=();ri!=();)
{
if(*ri % 2 == 0)
{
cout << "Erasing " << *ri << endl;
((++ri).base()); //erase()函数期待的是正向iterator,故而这里要调
//用base()函数将逆向iterator转换为正向的
}
else ++ri;
}
}
正确方法
void erase(map<int,int> &m)
{
for(map<int,int>::iterator mi=();mi!=();)
{
if(mi->second % 2 == 0)
{
cout << "Erasing " << mi->second << endl;
(mi++);
}
else ++mi;
}
}
编译器的相关知识
在《编译原理》中我们可以了解到一个编译器对程序代码的编译主要分为下面几个过程: a) 词法分析 b) 语法分析 c) 语义分析 d) 中间代码生成 e) 代码优化 f) 代码生成 g) 符号表管理 h) 将多个步骤组合成趟 i) 编译器构造工。
一、编译器的概念
编译器是将一种计算机语言翻译为另一种计算机语言的程序。编译器将源程序(source language)
编写的程序作为输入,翻译产生用目标语言(target language)编写的等价程序。源程序一般为高级语言(high-level language),如Pascal 或Delphi,而目标语言则是汇编语言或目标机器的目标代码(object code),有时也称作机器代码(machine code)
源程序→ 编译器→ 目标程序
解释器也是同编译器一样的一种语言翻译程序。它与编译器的不同之处在于:它立即执行源程序而不是生成目标代码。从原理上讲,任何程序设计语言都可以被解释或被编译。
二、编译器的组成部分
(1) 扫描程序(scanner)
在这个阶段编译器实际阅读源程序(通常以字符流的形式表示)。扫描程序执行词法分析(Lexical analysis):它将字符序列收集到称作记号(token)的有意义单元中,记号同自然语言,如英语中的字词相似。因此可以认为扫描程序执行与拼写相似的任务。
(2) 语法分析程序(parser)
语法分析程序从扫描程序中获取记号形式的源代码,并完成定义程序结构的语法分析(syntax analysis),这与自然语言中句子的语法分析类似。语法分析定义了程序的结构元素及其关系。通常将语法分析的结果表示为分析树( parse tree)或语法树(syntax tree)。
(3) 语义分析程序(semantic analyzer)
程序的语义就是它的“意思”,它与语法或结构不同。程序的语义确定程序的运行,但是大多数的程序设计语言都具有在执行之前被确定而不易由语法表示和由分析程序分析的特征。这些特征被称作静态语义( static semantic),而语义分析程序的任务就是分析这样的语义(程序的“动态”语义具有只有在程序执行时才能确定的特性,由于编译器不能执行程序,所以它不能由编译器来确定)。一般的程序
C (String函数) 来自淘豆网m.daumloan.com转载请标明出处.