在Object-c中,字典(KEY/VALUE)使用NSDictionary 和NSMutableDictionary(可變長)。使用語法如下:
[cpp]
NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys:@"value1",@"key1",@"value2",@"key1",nil];//注意用nil結束
取元素的方法:
[cpp]
NSString *value = [myDictionary objectForKey:@"key1"];
該寫法過於繁復。所以我將C++中的map類進行了封裝
[cpp]
#ifndef Discuz2_Maps_h
#define Discuz2_Maps_h
#include <map>
//比較器
template <class key_t>
struct dict_compare{
bool operator()(key_t x, key_t y){
return x < y;}
};
//僅針對NSString*比較器
template <>
struct dict_compare<NSString*>
{
bool operator()(NSString* __x, NSString* __y){
string x = [__x UTF8String];
string y = [__y UTF8String];
//std::cout<<x<< " " <<y<<endl;
return x < y;}
};
#define RELEASE_SAFELY(__POINTER) { [__POINTER release]; __POINTER = nil; }
#define RETAIN_SAFELY(__POINTER) { [__POINTER retain]; }
template <typename K, typename V, typename _Compare = dict_compare<K>,
typename _Alloc = std::allocator<std::pair<const K, V> > >
class Dict: public map<K, V, _Compare, _Alloc>
{
private:
typedef typename std::map<K, V>::iterator dict_it;
public:
Dict(){}
Dict(NSArray *array){
copyFromArray(array);
}
~Dict()
{
std::cout<<"dict destroy!"<<endl;
this->clear();
}
Dict& add(const K key, const V value){
this->insert(std::make_pair(key, value));
//RETAIN_SAFELY(value); 僅限於OBJECT-C對象類型
return (*this);
}
const V get(const K key){
dict_it it = this->find(key);
if(it != this->end())
return it->second;
else
return nil;
}
BOOL contains(const K key){
return this->find(key) == this->end() ? NO: YES;
}
/*
* 返回指定KEY的VALUE
*/
const V operator[](const K key)
{
return this->get(key);
}
void remove(const K key){
this->erase(key);
}
void clear(){
for_each(this->begin(), this->end(), ^(std::pair<K, V> pair){
//RELEASE_SAFELY(pair.second); 僅限於OBJECT-C對象類型
this->erase(pair.first);
});
}
void copyFromArray(NSArray *array){
if([array count] % 2 == 0){//元素個數需為偶數
for(int i = 0; i< [array count]; i++){
K key = (K)[array objectAtIndex:i];
V value = (V)[array objectAtIndex:++i];
this->add(key, value);
}
}
}
};
#endif
大家看到,這裡使用的定義比較器的方式來指定當KEY的類型是NSString時的比較方式。而這樣做的原因是當查找某KEY(NSString類型)時,這時在map比較器中的數據會出現字符長度變長的情況,且變長的那部分內容為亂碼。這會造成查不到相應的結果。當然這樣做會不會造成性能上的損失,目前還沒測試過。感興趣的朋友可以幫助測試一下。
下面來看一下具體用法。
實例化對象並添加數據:
[cpp]
Dict<NSString*,NSString*> dict;
dict.add(@"代震軍1", @"111111").add(@"代震軍2", @"222222");
或用下面方式:
[cpp]
NSArray *array = [[NSArray alloc] initWithObjects:
@"One", @"1", @"Two", @"2", @"Three", @"3", @"Four", @"4",nil];
Dict<NSString*, NSString*> dictBatch(array);
判斷是否存在某數據:
[cpp]
BOOL iscontains = dict.contains(@"代震軍3");
獲取記錄條數:
[cpp]
int size = dictBatch.size();
遍歷:
[cpp]
for(std::map<NSString*, NSString*>::iterator it = dict.begin(); it != dict.end();it++){
cout << [it->second UTF8String ]<<" " ;
}
或使用foreach:
[cpp]
__block NSString* str;
for_each(dict.begin(), dict.end(), ^(std::pair<NSString*, NSString*> pair){
str = pair.first;
cout << [pair.second UTF8String ]<<" " ;
});
獲取指定索引記錄:
[cpp]
NSString* result = dict[@"代震軍2"];
代碼比較簡單,就不多做解釋了,呵呵。