當C++遇到iOS應用開發—Dict集合

來源:互聯網
上載者:User

     在Object-c中,字典(KEY/VALUE)使用NSDictionary 和NSMutableDictionary(可變長)。使用文法如下:  NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys:@"value1",@"key1",@"value2",@"key1",nil];//注意用nil結束

    取元素的方法: NSString *value = [myDictionary objectForKey:@"key1"];

  
    該寫法過於繁複。所以我將C++中的map類進行了封裝:

 

#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->clearAll();
     }
    
     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 clearAll(){
         for_each(this->begin(), this->end(), ^(std::pair<K, V> pair){
             //RELEASE_SAFELY(pair.second); 僅限於OBJECT-C物件類型
           
         });this->clear();
     }
    
     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比較子中的資料會出現字元長度變長的情況,且變長的那部分內容為亂碼。這會造成查不到相應的結果。當然這樣做會不會造成效能上的損失,目
前還沒測試過。感興趣的朋友可以協助測試一下。

   
    下面來看一下具體用法。
  
    執行個體化對象並添加資料:    Dict<NSString*,NSString*> dict;
    dict.add(@"代震軍1", @"111111").add(@"代震軍2", @"222222");

   
    或用下面方式:    NSArray *array = [[NSArray alloc] initWithObjects:
                   @"One", @"1", @"Two", @"2", @"Three", @"3", @"Four", @"4",nil];
    Dict<NSString*, NSString*> dictBatch(array);

    判斷是否存在某資料:    BOOL iscontains = dict.contains(@"代震軍3");

   
    擷取記錄條數:    int size = dictBatch.size();

    遍曆:    for(std::map<NSString*, NSString*>::iterator it = dict.begin(); it != dict.end();it++){
        cout << [it->second UTF8String ]<<" " ;
    }

    或使用foreach:
     __block NSString* str;
    for_each(dict.begin(), dict.end(), ^(std::pair<NSString*, NSString*> pair){
        str = pair.first;
        cout << [pair.second UTF8String ]<<" " ;
    });

    擷取指定索引記錄:    NSString* result = dict[@"代震軍2"];

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

    好了,今天的內容就先到這裡了。

    原文連結:http://www.cnblogs.com/daizhj/archive/2012/11/09/2762753.html

    作者: daizhj, 代震軍
    微博: http://weibo.com/daizhj
    Tags:ios, c++, NSDictionary, NSMutableDictionary, map
   
   
   

  

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.