当C++遇到IOS应用开发---Dict集合
2012-11-09 15:47
393 查看
在Object-c中,字典(KEY/VALUE)使用NSDictionary 和NSMutableDictionary(可变长)。使用语法如下:
取元素的方法:
该写法过于繁复。所以我将C++中的map类进行了封装
大家看到,这里使用的定义比较器的方式来指定当KEY的类型是NSString时的比较方式。而这样做的原因是当查找某KEY(NSString类型)时,这时在map比较器中的数据会出现字符长度变长的情况,且变长的那部分内容为乱码。这会造成查不到相应的结果。当然这样做会不会造成性能上的损失,目前还没测试过。感兴趣的朋友可以帮助测试一下。
下面来看一下具体用法。
实例化对象并添加数据:
或用下面方式:
判断是否存在某数据:
获取记录条数:
遍历:
或使用foreach:
获取指定索引记录:
代码比较简单,就不多做解释了,呵呵。
好了,今天的内容就先到这里了。
原文链接:http://www.cnblogs.com/daizhj/archive/2012/11/09/2762753.html
作者: daizhj, 代震军
微博: http://weibo.com/daizhj
Tags:ios, c++, NSDictionary, NSMutableDictionary, map
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->erase(pair.first); });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
相关文章推荐
- 当C++遇到iOS应用开发之---List集合
- 当C++遇到IOS应用开发之---List集合
- 当C++遇到iOS应用开发---字符串处理
- 当C++遇到iOS应用开发---LRUCache缓存篇 [转]
- 当C++遇到iOS应用开发---字符串处理篇
- 当C++遇到IOS应用开发---SQLITE篇
- 当C++遇到IOS应用开发—LRUCache缓存
- 当C++遇到IOS应用开发---LRUCache缓存
- 当C++遇到iOS应用开发---SQLITE篇
- 当C++遇到IOS应用开发---SQLITE篇
- 当C++遇到iOS应用开发---SQLITE篇
- 当C++遇到IOS应用开发---LRUCache缓存
- 当C++遇到iOS应用开发---Dict集合
- 当C++遇到iOS应用开发---LRUCache缓存
- 当C++遇到IOS应用开发---SQLITE篇
- 当C++遇到IOS应用开发---LRUCache缓存
- 当C++遇到IOS应用开发---字符串处理
- 当C++遇到iOS应用开发---LRUCache缓存篇
- iOS 6开发---应用集合视图(UICollectionView)-实现补充视图(Supplementary View)
- IOS开发 与C++混编遇到的问题