程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> 當C++遇到IOS應用開發---Dict集合

當C++遇到IOS應用開發---Dict集合

編輯:C++入門知識


     在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"]; 


    代碼比較簡單,就不多做解釋了,呵呵。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved