??xml version="1.0" encoding="utf-8" standalone="yes"?> 大多数操作系l,在应用程序所寄存的可执行E序映像Q如Windowspȝ里的.exeQ、它所q行的进E以及和用户交互的图标和应用之间有一U严格的1?关系。在Androidpȝ里,q些兌要松散得多。ƈ且重要的是要理解各种概念怎么L成整体?/p>
׃Android应用固有的灵zL,当实现这些不同方面的时候有一些基本术语需要加以理解: 一个Android?Q?apkQ文Ӟ其中包含一个应用程序的代码和资源。这是应用程序分发和下蝲的文Ӟ用户用来安装该应用程序在他们的设备上? q里的一个关键点是:当用LC?#8220;应用”Ӟ他们实际上在和Q务打交道。如果您刚刚创徏一个包含若q活动的.apkQ其中之一是顶层入口点Q?q动作android.intent.action.MAIN的意图过滤器intent-filter和类?android.intent.category.LAUNCHERQ,那么q事实上ؓ您的.apk创徏一个Q务,q且您从那儿起动的Q何活动都作?那个d的一部分q行?/p>
一个Q务,那么Q从用户的角度来看是您的应用E序;而从应用E序开发者的角度来看Q它是一个或多个用户在那个Q务中已经l历q且未关闭的zdQ或?说是一个活动栈。一个新的Q务通过以Intent.FLAG_ACTIVITY_NEW_TASK标志起动一个活动意图来创徏;q一意图被用来作ؓd 的根意图Q定义Q务是什么。Q何不以这个标志v动的zd和起动它的zd在相同的d中运行(除非该活动已h特别启动模式Q稍后会讨论Q。Q务可以被?新安排:如果您用FLAG_ACTIVITY_NEW_TASK标志但已l有一个Q务以q个意图q行Q则当前d的活动栈被切换到前台而不是开始一?新的d?/p>
FLAG_ACTIVITY_NEW_TASK必须谨慎使用Q用它意味着Q在用户看来Q一个新的应用程序由此v动。如果这不是你所期望的行为,?׃该去创徏一个新的Q务。另外,仅在用户可以从桌面返回到他原来的地方和以一个新d启动相同意图的情况下Q你才应该用新的Q务标记。否则,如果用户 在你已经启动的Q务里按桌面(HOMEQ键Q而不是返回(BACKQ键Q你的Q务及其活动将被放|到桌面后面Q没有办法再切换回去?/p>
dq性Affinity 在某些情况下QAndroid需要知道一个活动属于哪个Q务即使它没有被启动到一个具体的d里。这是通过dq性(AffinitiesQ完?的。Q务共用性(AffinitiesQؓq个q行一个或多个zd的Q务提供了一个独特的静态名Uͼ默认的一个活动的dq性(AffinityQ是?C该活动的.apk包的名字。这提供了预期的标准Ҏ,x有在一个特定的.apk包里的活动是单个用户应用E序的一部分?/p>
当开始一个没有Intent.FLAG_ACTIVITY_NEW_TASK标志的活动时QQ务共用性affinities不会影响会q行该新z?动的d:它Lq行在启动它的Q务里。但是,如果使用了NEW_TASK标志Q那么共用性(affinityQ将被用来判断是否已l存在一个有相同q 性(affinityQ的d。如果是q样Q这Q务将被切换到前面而新的活动会启动于这个Q务的层?/p>
q种Ҏ在您必M用NEW_TASK标志的情况下最有用Q尤其是从状态栏通知或桌面快h式启动活动时。结果是Q当用户用这U方式启动您的应用程序时Q它的当前Q务将被切换到前台Q而且惌查看的活动被攑֜最上面?/p>
你可以在E序清单QManifestQ文件的应用E序application标签中ؓ.apk包中所有的zd分配你自qdq性AffinitesQ或者在zd标记中ؓ各个zdq行分配。一些说明其如何使用的例子如下: 如果您的.apk包含多个用户可以启动的高层应用程序,那么您可能需要对用户看到的每个活动指定不同的affinities。一个不错的命名惯例?以附加一个以冒号分隔的字W串来扩展您?apk包名。例如,“ com.android.contacts ”.apk可以有affinities:“com.android.contactsQDialer”?#8220; com.android.contactsQContactsList”? 您控制活动和d交互的主要途径是通过zd的launchMode 属性和意图相关的标志flags。这两个参数可以以各U方式合作来控制zd启动的结果,正如它们相关文中描q的那样。在q里Q我们将看看一些常见的用例和参数组合?/p>
你将使用的最常见的启动模式(除了默认的standard模式Q是singleTop。这q不影响d;它只是避免多ơ在一个堆栈顶部v动同一zd?/p>
singleTask启动模式对Q务有重大的媄响:它ɋzd始终是开始于一Ҏ的Q务(或其现有的Q务被带到前台Q?。用这U模式需要}慎对待你如何与系l其他部分进行交互,因ؓq媄响到q个zd中的每一个\径。它应当仅在zd处于应用E序前台时用(也就是支?MAIN动作和LAUNCHERcdQ?/p>
singleInstance启动模式更是专业Qƈ应仅用于整个是被实Cؓ一个活动的应用E序中?/p>
有一U你会经帔R到的情况是当另一个实体(如SearchManager 或NotificationManagerQ开始您的一个活动。在q种情况下,必须使用Intent.FLAG_ACTIVITY_NEW_TASK 标签Q因Ҏ动是在Q务之外v动的Q而且应用/d可能Ҏ不存在)。正如前面所qͼq种情况下的标准行ؓ是把匚w新活动affinity的Q务带?前台和在此之上v动新的活动。不q,也有其他您可以实施的行ؓcd?/p>
其中一U常见的做法是,q可以用Intent.FLAG_ACTIVITY_CLEAR_TOP 国旗与NEW_TASK 。通过q样做,如果你的d已经q行Q那么将提请前景Q所有的zdQ其堆栈清除除根pL力和根系zd的onNewIntent Q意图) 所谓的意图正在开始。请注意Q该zdq常怋用singleTop 或singleTask 发射模式Ӟ使用q种ҎQ因此,目前的情冉|׃新的意图而不需要将它摧毁,一个新的实例开始?/p>
一U通常的办法是和NEW_TASK联合h使用Intent.FLAG_ACTIVITY_CLEAR_TOP标志。这P如果您的d已经q?行,那么它将会被带到前台Q除Ҏ动外其它所有堆栈中的活动都被清除,而且q个Ҏ动的ҎonNewIntent(Intent)会在该意图v动时被调 用。注意这个活动用这个方法时l常使用singleTop或者singleTask起动模式Q这样当前实例被赋予新的意图而不是需要销毁它然后重新起动 一个新的实例?/p>
您能采取的另外的Ҏ是设|通知zd的Q务affinity为空字符?#8220;”Q表C没有affinityQ,q设|?finishOnBackground属性。这U方法是有用的如果你希望q个通知把用户带C个单独的描述它的zd中,而不是返回到应用E序的Q务。通过 指定q个属性,该活动将被结束不用户通过BACKq是HOMEd?如果q个属性没有指定,按首将Dq个zd及其d仍保留在pȝ里,且可能没?办法q回它?/p>
请务必阅d于launchMode属性和Intent标志的文以获取q些选项的详l说明?/p>
q程 在Android里,q程完全是应用的实现l节Q而不是用户通常了解的那栗其主要用途就是: 通过安置不受信Q的或不稳定的代码到另一个进E来提高E_性或安全性? 参见安全 文以获取更多关于安全限制方面的信息?/p>
Android相关内容:
U程 每个q程包含一个或多个U程。多数情况下QAndroid避免在进E里创徏额外的线E,以保持应用程序单U程Q除非它创徏自己的线E。一个重要的l?果就是所有对zdActivityQ广播接收器BroadcastReceiver以及服务Service实例的调用都是由q个q程的主U程创徏的?/p>
注意新的U程q不会ؓ每个zdQ广播接收器Q服务或者内Ҏ供器QContentProviderQ实例而创建:q些应用E序的组件在q程里被实例 化(除非另有说明Q都在同一个进E处理)Q实际上是进E的ȝE。这说明当被pȝ调用时没有哪个组Ӟ包括服务Q会q行q程或者阻塞操作(像|络调用?者计@环)Q因阻止进E中的所有其他组件。你可以使用标准的线E类Thread或者Android的HandlerThread便捷cd对其它线 E执行远E操作?/p>
q里有一些关于这个线E规则的重要的例外: ?对IBinder或者IBinder实现的接口的调用p用线E或本地q程的线E池Q如果该呼叫来自其他q程Q分发,而不是它们的q程的主U程。特D情?下,一个服务的IBinder可以q样调用。(管调用服务里的Ҏ已经在主U程里完成。)q意味着IBinder接口的实现必要有一U线E安全的?法,q样LU程才能同时讉K它?br />
?对ContentProvider主要Ҏ的调用由调用U程或者主U程分发,如同IBinder一栗被指定的方法在内容提供器的c里有记录。这意味着实现q些Ҏ必须要有一U线E安全的模式Q这样Q意其它线E可以同时访问它?br />
?视图及其子类中的调用由正在运行着视图的线E生。通常情况下,q会被作E的ȝE,如果你创Z个线Eƈ昄一个窗口,那么l承的窗口视囑ְ从那个线E里启动?/p>
看下错误描述Q是 ~失q两个引用,呵呵Q明白了Q导入电话编译生成的Jar? out\target\common\obj\APPS\Phone_intermediates\classes.jar
03 intent.setType("image/*");
04 intent.putExtra("crop", "true");
05 intent.putExtra("aspectX", 1);
06 intent.putExtra("aspectY", 1);
07 intent.putExtra("outputX", 1000);
08 intent.putExtra("outputY", 1000Q?
09 intent.putExtra("scale", true);
10 intent.putExtra("return-data", false);
11 intent.putExtra(MediaStore.EXTRA_OUTPUT, getTempUri());
12 intent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString());
13 intent.putExtra("noFaceDetection", true);
14 startActivityForResult(intent, PHOTORESOULT);
15
16 //选择存储位置
17 Uri tempPhotoUri;
18
19 private Uri getTempUri() {
20 Uri tempPhotoUri = Uri.fromFile(getTempFile());
21 return tempPhotoUri;
22 }
23
24 private File getTempFile() {
25 if (isSDCARDMounted()) {
26
27 File f = new File(Environment.getExternalStorageDirectory(),"temp.jpg");
28 try {
29 f.createNewFile();
30 } catch (IOException e) {
31 ...
32 }
33 return f;
34 }
35 return null;
36 }
37
38 // 注意Q在我做的测试中Q用内部缓存是无法正确写入裁切后的囄的。请大家有兴的试一番,看是否有意外?br />
39 // pȝ是用全局的ContentResolver来做q个q程的文件io操作Qapp内部的存储被忽略。(猜测Q?br />
40 /*
41 File f = new File(getCacheDir(), "temp.jpg");
42 try {
43 f.createNewFile();
44 } catch (IOException e) {
45 ...
46 }
47 return f;
48 }
49 */
50
51 private boolean isSDCARDMounted(){
52 String status = Environment.getExternalStorageState();
53
54 if (status.equals(Environment.MEDIA_MOUNTED)){
55 return true;
56 }
57 return false;
58 }
59
60 // 处理l果
61 //
62 Bitmap bitmap = null;
63 try {
64 bitmap = BitmapFactory.decodeStream(getContentResolver().openInputStream(tempPhotoUri));
65 } catch (FileNotFoundException e) {
66 e.printStackTrace();
67 }
Android相关内容:
]]>
一个Q务一般而言是指用户视ؓ的一个可启动应用E序Q通常d在桌面(home screenQ有一个可讉K的图标,且可以被切换到前台?
一个进E是一个运行着应用E序代码的底层核心过E。通常所?apk里的代码q行在一个专有的q程里。不q,q程标记也可以用来限定代码运行位|,或者ؓ整个.apk或者ؓ个别的活动activityQ接收者receiverQ服务或提供者providerQ组件?
d
如果您正在替换一个通知Q快h式,或其他可以从外部发v的应用程??#8220;内部”zdQ你可能需要明设定您替代zd的taskAffinity和您准备替代的应用程序一栗例如,如果您想替换contacts详细信息视图 Q用户可以创建ƈ调用快捷方式Q,你得把taskAffinity讄?#8220;com.android.contacts”?
启动模式和启动标?/p>
通过在同一q程里运行多?apks的代码来减少开销?
通过把重量代码攑֜单独的进E中来帮助系l管理资源,该进E可以在不媄响应用程序其他部分的情况下被l止?
正如前面所qͼq个q程属性用来控制运行着特定应用E序lg的进E,注意Q此属性不能用于违反系l安全性:如果有两个不׃n相同用户ID?apks试q行在同一q程中,q将不会被允许,相反会ؓ它们每一个创Z同的q程?/p>
首先获取|络通讯cȝ实例
ConnectivityManager cwjManager=(ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE); Q?br />
使用cwjManager.getActiveNetworkInfo().isAvailable(); 来返回是否有效,如果为True则表C当前Android手机已经联网Q可能是WiFi或GPRS、HSDPA{等Q?br />
具体的可以通过ConnectivityManager cȝgetActiveNetworkInfo() Ҏ判断详细的接入方式,
需要注意的是有兌用需要加?br />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission> q个权限Q?br />
]]>
按照上面帖子的描qͼ新增User Library后,整个工程只剩下拨L面q有15个错误;
import com.android.phone.CallLogAsync;
import com.android.phone.HapticFeedback;
Eclipse相关内容:
]]>
地址Qhttp://subclipse.tigris.org/servlets/ProjectDocumentList?folderID=2240 q里有很多版本,误己选择合适的Q?br />
二、解压,删除解压后得到的文g中除了名叫features和plugins的两个文件夹以外的其他所有文件?br />
三、在MyEclipse10.0的安装目录中自己新徏一个文件夹Q我的叫MyPluginsQ然后把解压q删除过文g后得到的那个SVN文g?复制到该目录Q?br />
四、在MyEclipse10.0的安装目录下的dropins文g夹中建立一个文本文Ӟ内容输path=你的svn路径Q(我的是path=E:\\MyEclipse\\MyEclipse 10\\MyPlugins\\SVN-1.8.3Q,然后保存Q保存后该文g名重命名成SVN.lnk(C扩展名是?lnk不是|上有网友说的link).
五、接下来删除 MyEclipse10.0的安装目录下configuration文g夹中的org.eclipse.update文g夏V?br />
六、重启-〉OK?br />
]]>
//file: lunarday.h
//author: cuichaox@gmail.com
//2007-02-13 11:22:04
#ifndef LUANR_CALENDAR_H
#define LUANR_CALENDAR_H
namespace lunar
{
//保存一个农历日?br />
typedef struct T_Date
{
//q?br />
int year;
//?br />
int month;
//?br />
int day;
//是否闰月
bool leap;
} Date;
//公历转农?br />
Date LuanrDate(int solar_year,int solar_month,int solar_day);
}
//file: lunarday.cpp
//author: cuichao@gmail.com
//2007-02-13 11:22:48
#include "lunarday.h"
#include <ctime>
#include <cassert>
#include <cstring>
#include <iostream>
using namespace std;
using lunar::Date;
//使用比特位记录每q的情况
//0~4 ?bit 春节日䆾
//5~6 ?bit 春节月䆾
//7~19 ?3bit 13个月的大月情况(如果无闰月,最后位无效)Q大月ؓ1,月?
//20~23 ?bit 记录闰月的月份,如果没有闰月?
static const int BEGIN_YEAR = 1901;
static const int NUMBER_YEAR = 199;
static const unsigned int LUNAR_YEARS[199] = {
0x04AE53,0x0A5748,0x5526BD,0x0D2650,0x0D9544,
0x46AAB9,0x056A4D,0x09AD42,0x24AEB6,0x04AE4A, //1901-1910
0x6A4DBE,0x0A4D52,0x0D2546,0x5D52BA,0x0B544E,
0x0D6A43,0x296D37,0x095B4B,0x749BC1,0x049754, //1911-1920
0x0A4B48,0x5B25BC,0x06A550,0x06D445,0x4ADAB8,
0x02B64D,0x095742,0x2497B7,0x04974A,0x664B3E, //1921-1930
0x0D4A51,0x0EA546,0x56D4BA,0x05AD4E,0x02B644,
0x393738,0x092E4B,0x7C96BF,0x0C9553,0x0D4A48, //1931-1940
0x6DA53B,0x0B554F,0x056A45,0x4AADB9,0x025D4D,
0x092D42,0x2C95B6,0x0A954A,0x7B4ABD,0x06CA51, //1941-1950
0x0B5546,0x555ABB,0x04DA4E,0x0A5B43,0x352BB8,
0x052B4C,0x8A953F,0x0E9552,0x06AA48,0x7AD53C, //1951-1960
0x0AB54F,0x04B645,0x4A5739,0x0A574D,0x052642,
0x3E9335,0x0D9549,0x75AABE,0x056A51,0x096D46, //1961-1970
0x54AEBB,0x04AD4F,0x0A4D43,0x4D26B7,0x0D254B,
0x8D52BF,0x0B5452,0x0B6A47,0x696D3C,0x095B50, //1971-1980
0x049B45,0x4A4BB9,0x0A4B4D,0xAB25C2,0x06A554,
0x06D449,0x6ADA3D,0x0AB651,0x093746,0x5497BB, //1981-1990
0x04974F,0x064B44,0x36A537,0x0EA54A,0x86B2BF,
0x05AC53,0x0AB647,0x5936BC,0x092E50,0x0C9645, //1991-2000
0x4D4AB8,0x0D4A4C,0x0DA541,0x25AAB6,0x056A49,
0x7AADBD,0x025D52,0x092D47,0x5C95BA,0x0A954E, //2001-2010
0x0B4A43,0x4B5537,0x0AD54A,0x955ABF,0x04BA53,
0x0A5B48,0x652BBC,0x052B50,0x0A9345,0x474AB9, //2011-2020
0x06AA4C,0x0AD541,0x24DAB6,0x04B64A,0x69573D,
0x0A4E51,0x0D2646,0x5E933A,0x0D534D,0x05AA43, //2021-2030
0x36B537,0x096D4B,0xB4AEBF,0x04AD53,0x0A4D48,
0x6D25BC,0x0D254F,0x0D5244,0x5DAA38,0x0B5A4C, //2031-2040
0x056D41,0x24ADB6,0x049B4A,0x7A4BBE,0x0A4B51,
0x0AA546,0x5B52BA,0x06D24E,0x0ADA42,0x355B37, //2041-2050
0x09374B,0x8497C1,0x049753,0x064B48,0x66A53C,
0x0EA54F,0x06B244,0x4AB638,0x0AAE4C,0x092E42, //2051-2060
0x3C9735,0x0C9649,0x7D4ABD,0x0D4A51,0x0DA545,
0x55AABA,0x056A4E,0x0A6D43,0x452EB7,0x052D4B, //2061-2070
0x8A95BF,0x0A9553,0x0B4A47,0x6B553B,0x0AD54F,
0x055A45,0x4A5D38,0x0A5B4C,0x052B42,0x3A93B6, //2071-2080
0x069349,0x7729BD,0x06AA51,0x0AD546,0x54DABA,
0x04B64E,0x0A5743,0x452738,0x0D264A,0x8E933E, //2081-2090
0x0D5252,0x0DAA47,0x66B53B,0x056D4F,0x04AE45,
0x4A4EB9,0x0A4D4C,0x0D1541,0x2D92B5 //2091-2099
};
//计算q个公历日期是一q中的第几天
static int DayOfSolarYear(int year, int month, int day )
{
//Z提高效率Q记录每月一日是一q中的第几天
static const int NORMAL_YDAY[12] = {1,32,60,91,121,152,
182,213,244,274,305,335};
//闰年的情?br />
static const int LEAP_YDAY[12] = {1,32,61,92,122,153,
183,214,245,275,306,336};
const int *t_year_yday_ = NORMAL_YDAY;
//判断是否是公历闰q?br />
if( year % 4 ==0 )
{
if(year%100 != 0)
t_year_yday_ = LEAP_YDAY;
if(year%400 == 0)
t_year_yday_ = LEAP_YDAY;
}
return t_year_yday_[month -1] + (day -1);
}
Date lunar::LuanrDate(int solar_year,int solar_month,int solar_day)
{
Date luanr_date ;
luanr_date.year = solar_year;
luanr_date.month = 0;
luanr_date.day = 0;
luanr_date.leap = false;
//界查,如果界Q返回无效日?br />
if(solar_year <= BEGIN_YEAR || solar_year > BEGIN_YEAR + NUMBER_YEAR - 1 )
return luanr_date;
int year_index = solar_year - BEGIN_YEAR;
//计算春节的公历日?br />
int spring_ny_month = ( LUNAR_YEARS[year_index] & 0x60 ) >> 5;
int spring_ny_day = ( LUNAR_YEARS[year_index] & 0x1f);
//计算今天是公历年的第几天
int today_solar_yd = DayOfSolarYear(solar_year,solar_month,solar_day);
//计算春节是公历年的第几天
int spring_ny_yd = DayOfSolarYear(solar_year,spring_ny_month,spring_ny_day);
//计算今天是农历年的第几天
int today_luanr_yd = today_solar_yd - spring_ny_yd + 1;
//如果今天在春节的前面Q重新计today_luanr_yd
if ( today_luanr_yd < 0)
{
//农历q比当前公历q小1
year_index --;
luanr_date.year --;
//界Q返回无效日?br />
if(year_index <0)
return luanr_date;
spring_ny_month = ( LUNAR_YEARS[year_index] & 0x60 ) >> 5;
spring_ny_day = ( LUNAR_YEARS[year_index] & 0x1f);
spring_ny_yd = DayOfSolarYear(solar_year,spring_ny_month,spring_ny_day);
int year_total_day = DayOfSolarYear(luanr_date.year,12,31);
today_luanr_yd = today_solar_yd + year_total_day - spring_ny_yd + 1;
}
int luanr_month = 1;
//计算月䆾和日?br />
for(;luanr_month<=13;luanr_month++)
{
int month_day = 29;
if( (LUNAR_YEARS[year_index] >> (6 + luanr_month)) & 0x1 )
month_day = 30;
if( today_luanr_yd <= month_day )
break;
else
today_luanr_yd -= month_day;
}
luanr_date.day = today_luanr_yd;
//处理闰月
int leap_month = (LUNAR_YEARS[year_index] >>20) & 0xf;
if(leap_month > 0 && leap_month < luanr_month )
{
luanr_month --;
//如果当前月ؓ闰月Q设|闰月标?br />
if( luanr_month == leap_month )
luanr_date.leap = true;
}
assert(leap_month <= 12);
luanr_date.month = luanr_month;
return luanr_date;
}
试d敎ͼ打印当前农历日期
//file: chdate.cpp
//author: cuichaox@gmail.com
//2007-02-13 11:21:45
#include <iostream>
#include <ctime>
#include "lunarday.h"
int main(int argc, char *argv[])
{
using namespace std;
using namespace lunar;
time_t current_time;
time(¤t_time);
tm *current_tm = localtime(¤t_time);
int year = current_tm->tm_year + 1900;
int month = current_tm->tm_mon +1;
int day = current_tm->tm_mday;
Date lunar_date = LuanrDate(year,month,day);
cout<<lunar_date.year<<"q?;
if(lunar_date.leap)
cout<<"?;
cout<<lunar_date.month<<"?;
cout<<lunar_date.day<<"?;
cout<<endl;
return 0;
}
Makefile文gQ如?br />#makefile for chdate
CPP = g++
LD = g++
CC_FLAG =
LD_FLAG =
FILE_LIST = lunarday.cpp chdate.cpp
OBJ_LIST = $(FILE_LIST:%.cpp=%.o)
BIN = chdate
default: $(BIN)
$(BIN): $(OBJ_LIST)
$(LD) $(LD_FLAG) -o $(BIN) $(OBJ_LIST)
%.o : %.cpp
@$(CPP) $(CC_FLAG) -c $< -o $@
clean:
rm $(OBJ_LIST) $(BIN)
执行效果如下
sideleft@doom:~/workspace/luanrday$ ./chdate
2006q?2?6?/div>
]]>
Pre-processor commands
Operator Precedence
Escape Sequences
ASCII Chart
Data Types
Keywords
Standard C Library
Standard C I/O
Standard C String & Character
Standard C Math
Standard C Time & Date
Standard C Memory
Other standard C functions
All C Functions
C++
C++ I/O
C++ Strings
Miscellaneous C++
C++ Standard Template Library
C++ Algorithms
C++ Vectors
C++ Double-Ended Queues
C++ Lists
C++ Priority Queues
C++ Queues
C++ Stacks
C++ Sets
C++ Multisets
C++ Maps
C++ Multimaps
C++ Bitsets
]]>