C++标准库与Java基础类对照

C++标准库与Java基础类对照表
作者: Daly     日期:2007-08-11  
 
一、集合类
 对象的集合,指如链表,数组,队列这一类的数据结构。在C++标准库中把这些成为Container, 在Java中称为Collection。
 
C++STL常用Container: vector, list, map, set, queue, stack, priority_queue
Java基础类:ArrayList, HashMap, HashSet
 
注意:
在C++中采用了模板适应各种类型。Java中没有模板,由于各个对象都是派生自Object类, 元素会自动向上转换。Java的这种机制可能会引起一些非法的类型转换,从而导致程序错误。当从Java的Collection取对象时,返回的是Object对象,因此需要程序员进行显式的向下转换。另外,Java的Collection不支持基本类型,解决办法是利用基本包装类(如Integer, Float, Double等)。
在JDK 5.0中加入了泛型类型,形式上有点像C++的模板,例如定义ArrayList<String> v, 这种的语法清晰地显示了v是存放String的容器。Java的泛型编程超出本文范围,请参阅相关资料。  考虑到兼容性的问题,本文对Collection的定义没有采用泛型的形式。
 
vector与ArrayList
 
 
C++
Java
定义
vector<int> vTest(50)
ArrayList vTest = new ArrayList()
追加
int x = 5;
vTest.push_back( x )
Integer x = new Interger(5)
vTest.add( x )
元素个数
vTest.size()
vTest.size()
判断空
vTest.empty() // TRUE 为空
vTest.isEmpty()
插入
vector<int>::iterator iter;
int y = 15;
iter = vTest.begin();
vTest.insert(iter+4, y)
int y = 15;
vTest.add( 5, y)
删除
vTest.erase( vTest.begin() )
vTest.remove(5)
迭代
vector<int>::iterator iter;
iter = vTest.begin();
int xx = 0;
while( iter != vTest.end() )
{
 xx = *iter;
 iter++;
}
iterator it = vTest.iterator(); // 取得第一个
while( it.hasNext() )
{
   Integer xx = (Integer) it.next();  // 向下转换
}
获取
vTest[i]
 vTest.at(i)
读取 vTest.get(i)
写入 vTest.set(i, new Integer(15));
清空
vTest.clear()
vTest.clear()
 
list与LinkedList
     双向链表。
map与HashMap
        C++ STL中的map一般是用红黑树(RB-Tree)实现,Java的HashMap多用散列(hash)的方法实现。
       Java的HashMap一般都要重载equals()和hashCode()方法 。
  
 
C++
Java
定义
map<string, int> mapTest
HashMap mapTest = new HashMap()
插入
mapTest[ string(“hello”) ] = 1;
或者
typedef map<string,int>::value_type valType;
string str = “hello”;
mapTest.insert(valType(str, 1));
 
mapTest.put(“hello”, new Integer(1) );
查找
mapTest.count(“hello”) 判断个数
map<string,int>::iterator it;
it = mapTest.find(“hello”);
int x = (*it).second;
 
判断存在:
   mapTest.containsKey()
获取
Integer x = (Integer)mapTest.get(“hello”)
 
二、算法
 
    下面讲述的C++的泛型算法只适用于随机访问的容器,如数组,vector等。对List和Map不使用。List有自己一套算法方法。
 
 
C++
Java
定义
vector<string> vec; //假设已插入数据
vector<string>::iterator it;
ArrayList vec = new ArrayList(); //假设已插入数据
Iterator it = vec.iterator();
排序
sort(vec.begin(), vec.end())
Collections.sort(vec);
查找
find(vec.begin(), vec.end(), “hello”)
 
二分查找:
int pos = Collections.binarySearch(vec, “hello”);
复制
int ia[] = {1,2,3,4,5}
vector<int> vec;
copy(ia, ia+5, back_inserter(vec));
 
 
三、字符串
 
    C++采用string类,Java采用String类。java的String类一经初始化就不能改变,每次增加或删除字符时会构建一个新的String类,在频繁改变操作中会大量内存耗费。可变的String应采用StringBuffer类。
 
C++
Java
定义
string str = “cpp string”;
string str(“hello”);
转换为 C 风格字符串
str.c_str();
String str = “java string”
追加
str = str + “world”;
str.append(“world”);
str = “hello” + “world”;
str.concat(“world”);
长度
str.length()
str.length();
比较
str.compare(otherstr);
判断相等
str == otherstr
str.CompareTo(otherstr);
判断相等 :
str.equals(otherstr);
正则表达式匹配
str.matches(“^#(.)+$”);
子串
str.substr(5,6) // 5 个字符 , 长度 6
str.substring(5,8) // 5 到第 8 个字符
 
分割:
String str = “CHN,JPN,RUS”;
String vecstr[];
vecstr = str.split(“,”);
结果为 String 数组
“CHN”, “JPN”, “RUS”
查找
int idx = str.find(“cpp”);
if( idx != string::npos ) {
 ... ... // 找到位置
}
 
查找第一个出现 0~9 字符的位置
int idx = find_first_of(str, “1234567890”);
 
int idx = str.indexOf(“cpp”);
if( idx != -1) {
 .. ...
}
清空
str.clear()
str.clear()
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值