博文

map的使用(2007-08-31 18:17:00)

摘要:当我们遇到字符串与整数的映射关系时,用map使用很方便,所以我就整理了一些关于map的使用方法:
1、map的头文件是map.h
2、map的定义
   如map<string,int>word,这样就定义了map的字符串到整数的对象word(就对象名),也可以定义整数到字符串的对象,具体看什么情况。注意定义时不能用char*。
具体例子如下:
map<string,int>age;  //定义姓名到年龄的映射
age["zhangsan"]=20;
age["lisi"]=21;
下面介绍map的一些函数:
1、clear()
就是清除map对象的所有内容
如age.clear();这样就清楚了age的内容
2、erase(key)
删除key对应的元素
如age.erase("lisi");就删除了lisi的信息
3、size()
获取对象的元素个数
如n=age.size();则n=2(上面定义了2个元素);
4、begin()
获取对象的第一个元素的指针
5、end()
获取对象的最后一个元素的指针
6、find(key)
查找key对应的元素

typedef   map<string,int>maps;
maps age;
maps::iterator it;
it=age.find("wangwu");
如果找到"wangwu"的元素,就返回它所对应的元素指针,否则就指向end();
7、元素的访问或遍历举例
typedef   map<string,int>maps;
maps age;
age["zhangsan"]=20;
age["lisi"]=21;
maps::iterator it;
for(it=age.begin();it!=age.end();it++)
{
    cout<<"name:"<<it->first<<"......

阅读全文(2752) | 评论:0

C++风格与技巧(转)(2006-05-29 00:16:00)

摘要:目录: 我如何写这个非常简单的程序? 为什么编译要花这么长的时间? 为什么一个空类的大小不为0? 我必须在类声明处赋予数据吗? 为什么成员函数默认不是virtual的? 为什么析构函数默认不是virtual的? 为什么不能有虚拟构造函数? 为什么重载在继承类中不工作? 我能够在构造函数中调用一个虚拟函数吗? 有没有“指定位置删除”(placement delete)? 我能防止别人继承我自己的类吗? 为什么不能为模板参数定义约束(constraints)? 既然已经有了优秀的qsort()函数,为什么还需要一个sort()? 什么是函数对象(function object)? 我应该如何对付内存泄漏? 我为什么在捕获一个异常之后就不能继续? 为什么C++中没有相当于realloc()的函数? 如何使用异常? 怎样从输入中读取一个字符串? 为什么C++不提供“finally”的构造? 什么是自动指针(auto_ptr),为什么没有自动数组(auto_array)? 可以混合使用C风格与C++风格的内存分派与重新分配吗? 我为什么必须使用一个造型来转换*void? 我如何定义一个类内部(in-class)的常量? 为什么delete不会将操作数置0? 我能够写“void main()”吗? 为什么我不能重载点符号,::,sizeof,等等? 怎样将一个整型值转换为一个字符串? “int* p”正确还是“int *p”正确? 对于我的代码,哪一种布局风格(layout style)是最好的? 我应该将“const”放在类型之前还是之后? 使用宏有什么问题? 我如何写这个非常简单的程序? 特别是在一个学期的开始,我常常收到许多关于编写一个非常简单的程序的询问。这个问题有一个很具代表性的解决方法,那就是(在你的程序中)读入几个数字,对它们做一些处理,再把结果输出。下面是一个这样做的例子: #include<iostream> #include<vector> #include<algorithm> using namespace std; int main() { vector<double> v; double d; while(cin>......

阅读全文(2823) | 评论:0

C++编程人员容易犯的10个C#错误(转)(2006-05-29 00:13:00)

摘要:C#的语法与C++非常相似,有些变化引起的错误却很严重,本讨论C++编程人员最容易犯的十个错误。

  我们知道,C#的语法与C++非常相似,实现从C++向C#的转变,其困难不在于语言本身,而在于熟悉.NET的可管理环境和对.NET框架的理解。尽管C#与C++在语法上的变化是很小的,几乎不会对我们有什么影响,但有些变化却足以使一些粗心的C++编程人员时刻铭记在心。在本篇文章中我们将讨论C++编程人员最容易犯的十个错误。  陷阱1: 没有明确的结束方法  几乎可以完全肯定地说,对于大多数C++编程人员而言,C#与C++最大的不同之处就在于碎片收集。这也意味着编程人员再也无需担心内存泄露和确保删除所有没有用的指针。但我们再也无法精确地控制杀死无用的对象这个过程。事实上,在C#中没有明确的destructor。  如果使用非可管理性资源,在不使用这些资源后,必须明确地释放它。对资源的隐性控制是由Finalize方法(也被称为finalizer)提供的,当对象被销毁时,它就会被碎片收集程序调用收回对象所占用的资源。finalizer应该只释放被销毁对象占用的非可管理性资源,而不应牵涉到其他对象。如果在程序中只使用了可管理性资源,那就无需也不应当执行Finalize方法,只有在非可管理性资源的处理中才会用到Finalize方法。由于finalizer需要占用一定的资源,因此应当只在需要它的方法中执行finalizer。直接调用一个对象的Finalize方法是绝对不允许的(除非是在子类的Finalize中调用基础类的Finalize。),碎片收集程序会自动地调用Finalize。  从语法上看,C#中的destructor与C++非常相似,但其实它们是完全不同的。C#中的destructor只是定义Finalize方法的捷径。因此,下面的二段代码是有区别的: ~MyClass() { // 需要完成的任务 } MyClass.Finalize() {// 需要完成的任务 base.Finalize(); }  错误2:Finalize和Dispose使用谁?  从上面的论述中我们已经很清楚,显性地调用finalizer是不允许的,它只能被碎片收集程序调用。如果希望尽快地释放一些不再使用的数量有限的非可管理性资......

阅读全文(1951) | 评论:0

C语言高效编程的四大绝招(转)(2006-05-29 00:11:00)

摘要:编写高效简洁的C语言代码,是许多软件工程师追求的目标。本文就是针对编程工作中的一些体会和经验做相关的阐述。

  第一招:以空间换时间

  计算机程序中最大的矛盾是空间和时间的矛盾,那么,从这个角度出发逆向思维来考虑程序的效率问题,我们就有了解决问题的第1招--以空间换时间。比如说字符串的赋值:

  方法A:通常的办法 #define LEN 32
char string1 [LEN];
memset (string1,0,LEN);
strcpy (string1,"This is a example!!");
  方法B: const char string2[LEN] ="This is a example!";
char * cp;
cp = string2 ;
  使用的时候可以直接用指针来操作。

  从上面的例子可以看出,A和B的效率是不能比的。在同样的存储空间下,B直接使用指针就可以操作了,而A需要调用两个字符函数才能完成。B的缺点在于灵活性没有A好。在需要频繁更改一个字符串内容的时候,A具有更好的灵活性;如果采用方法B,则需要预存许多字符串,虽然占用了大量的内存,但是获得了程序执行的高效率。

  如果系统的实时性要求很高,内存还有一些,那我推荐你使用该招数。该招数的变招--使用宏函数而不是函数。举例如下:

  方法C: #define bwMCDR2_ADDRESS 4
#define bsMCDR2_ADDRESS 17
int BIT_MASK(int __bf)
{
 return ((1U << (bw ## __bf)) - 1)<< (bs ## __bf);
}
void SET_BITS(int __dst,
int __bf, int __val)
{
 __dst = ((__dst) & ~(BIT_MASK(__bf))) |
\
 (((__val) << (bs ## __bf))
& (BIT_......

阅读全文(2215) | 评论:1

C++中动态内存分配引发问题的解决方案(转)(2006-05-29 00:09:00)

摘要:  假设我们要开发一个String类,它可以方便地处理字符串数据。我们可以在类中声明一个数组,考虑到有时候字符串极长,我们可以把数组大小设为200,但一般的情况下又不需要这么多的空间,这样是浪费了内存。对了,我们可以使用new操作符,这样是十分灵活的,但在类中就会出现许多意想不到的问题,本文就是针对这一现象而写的。现在,我们先来开发一个Wrong类,从名称上看出,它是一个不完善的类。的确,我们要刻意地使它出现各种各样的问题,这样才好对症下药。好了,我们开始吧!   Wrong.h: #ifndef WRONG_H_
#define WRONG_H_
class Wrong
{
private:
char * str; //存储数据
int len; //字符串长度 public:
Wrong(const char * s); //构造函数
Wrong(); // 默认构造函数
~Wrong(); // 析构函数
friend ostream & operator<<(ostream & os,const Wrong& st);
};
#endif Wrong.cpp: #include <iostream>
#include <cstring>
#include "wrong.h"
using namespace std;
Wrong::Wrong(const char * s)
{
len = strlen(s);
str = new char[len + 1];
strcpy(str, s); }//拷贝数据 Wrong::Wrong()
{
len =0;
str = new char[len+1];
str[0]='\0'; } Wrong::~Wrong()
{
cout<<"这个字符串将被删除:"<<str<<'\n';//为了方便观察结果,特留此行代码。
delete [] str;
} ostream & operator<<(ostream & os, const Wrong & s......

阅读全文(1912) | 评论:0

C语言中使用中常见的错误分析(转)(2006-05-06 15:09:00)

摘要:1  引言        C语言是比较通用的一种程序设计语言,具有数据类型多样、函数丰富、运算灵活、生成目标程序效率高、应用面广、可移植性好、且可以直接对硬件系统进行控制操作等优点而受到广泛的欢迎,目前很多高校都开设了C语言课程。但由于C语言书写比较灵活,语法限制不严,对初学者来说容易出错。笔者在教学中针对学生学习C语言时常见错误进行了分析,供初学者借鉴。 2  C语言使用中常见的错误 2.1   系统设置错误编译时出现“LinkerError:Unabletoopeninputfile‘COS.OBJ’”错误信息。说明连接目录在错误,改正的方法是在菜单“Option”中“Directories”需重新设置“Includedirectories”、“Librarydirecto-ries”和“Turbocdirectories”,如果TC安装在D:\TC目录下,那么以上三项分别应设置为“D:\TC\INCLUDE”、“D:\TC\LIB”、“D:\TC\TC”,然后使用菜单“Option”→“Saveoptions”保存当前的设置。这种错误常发生在TC不是安装在C盘的根目录下,因为系统默认是C盘的设置。 2.2  大小写错误C语言规定所有的关键字必须小写,而标识符中的字母则既可以大写,也可以小写,标识符不能与关键字相同,并区分大小写字母。例如,else是关键字,不能作为标识符使用,而ELSE可以作为标识符使用。  2.3  漏写分号、花括号在C语言中,规定一个语句必须以分号结束或花括号结束,如:intx=1;{inty=2;y+=x;printf("%d,%d\n",x,y);}应注意,复合语句中的最后一个语句仍然需要分号,最后一个“}”不能省略。比较容易忽视的是在“}”之后的分号,如一个类型的定义之后必须使用分号,包括结构体、联合体和枚举。如:structst{intx,*y;}; 2.4  混淆“=”与“==”的区别在C语言中“=”是赋值运算符,不能作等号使用,这与其它高级语言是有区别的,而“==”是关系运算符,比较两个数据是否相等,且“==”比“=”优先级别高,如:main(){intx=1,y=2;print......

阅读全文(4848) | 评论:2