惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

AI
AI
爱范儿
爱范儿
IT之家
IT之家
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
有赞技术团队
有赞技术团队
The GitHub Blog
The GitHub Blog
V
Visual Studio Blog
人人都是产品经理
人人都是产品经理
罗磊的独立博客
D
Docker
美团技术团队
Recent Announcements
Recent Announcements
H
Hackread – Cybersecurity News, Data Breaches, AI and More
月光博客
月光博客
P
Proofpoint News Feed
博客园 - 聂微东
宝玉的分享
宝玉的分享
博客园 - 【当耐特】
H
Help Net Security
T
Tailwind CSS Blog
S
Securelist
Google DeepMind News
Google DeepMind News
Scott Helme
Scott Helme
Jina AI
Jina AI
C
Cybersecurity and Infrastructure Security Agency CISA
Y
Y Combinator Blog
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
博客园 - Franky
S
Security @ Cisco Blogs
C
CXSECURITY Database RSS Feed - CXSecurity.com
U
Unit 42
S
SegmentFault 最新的问题
Project Zero
Project Zero
P
Palo Alto Networks Blog
T
Threat Research - Cisco Blogs
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
F
Full Disclosure
P
Privacy & Cybersecurity Law Blog
J
Java Code Geeks
D
Darknet – Hacking Tools, Hacker News & Cyber Security
博客园_首页
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
M
MIT News - Artificial intelligence
NISL@THU
NISL@THU
Recent Commits to openclaw:main
Recent Commits to openclaw:main
大猫的无限游戏
大猫的无限游戏
博客园 - 三生石上(FineUI控件)
Martin Fowler
Martin Fowler
V
Vulnerabilities – Threatpost
S
Schneier on Security

博客园 - 代震军

重磅发布码农界的第一张吉他专辑小样 HRPlugin For Xcode发布(附源码地址) 当C++遇到iOS应用开发---LRUCache缓存 当C++遇到iOS应用开发之---List集合 当C++遇到iOS应用开发---字符串处理 当C++遇到iOS应用开发---SQLITE篇 开源ImageFilter库For IOS源码发布 开源ImageFilter库v0.4:新增26种图片效果 开源ImageFilter库v0.3:新增22种图片效果 开源ImageFilter库v0.2:新增7类滤镜,支持12种图片效果 Android, WindowsPhone7, IOS ,vc2010平台40多套图片滤镜开源 Discuz!NT中的LLServer架构设计 LLServer1.0及C#客户端正式发布并开源 Mongodb源码分析--Replication之OpLog Mongodb源码分析--Replication之主从模式--Slave 这样的“牛”人最好别碰上 Mongodb源码分析--Replication之主从模式--Master Mongodb源码分析--链接池(ConnPool) Mongodb源码分析--Mongos之分布式锁
当C++遇到iOS应用开发---Dict集合
代震军 · 2012-11-09 · via 博客园 - 代震军


     在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