當C++遇到iOS應用開發之---List集合


      在Object-c中,數組使用NSArray和NSMutableArray(可變長數組)。使用語法如下:
     
NSArray *array = [[NSArray alloc] initWithObjects: @" One ", @" Two ", @" Three ", @" Four ",nil];

      取數組元素的方法:
   [array objectAtIndex: 2]);

      因為數組在開發中會被頻繁使用,且objectAtIndex的寫法看着過於繁復,遠不如array[2]這種直觀。所以我將C++中的vector類進行了封裝,並增加一些新的功能:

#include <iostream>
#include <vector>

using  namespace std;
using  namespace std::tr1;
template<typename T, typename _Alloc = std::allocator<T> >
class  List:  public vector<T, _Alloc>
{
private:
    typedef typename std::vector<T>::iterator list_it;
   
    list_it _it;

public:
    List(){}
   
    List(NSArray *array){
        copyFromArray(array);
    }
   
      
    List( string *array){
        copyFromArray(array);
    }
   
    List( int *array){
        copyFromArray(array);
    }
   
    ~List()
    {
        std::cout<< " list destroy! "<<endl;
    }
   
    List& add( const T t){
         this->push_back(t);
         return (* this);
    }
   
     void clear(){
         // this->clear();
         this->erase( this->begin(),  this->end());
    }
   

    BOOL contains( const T t){
         return indexOf(t) >=  0;
    }
   

     int indexOf( const T t){
        list_it it = std::find( this->begin(), this->end() , t ) ;
         if(it !=  this->end())
             return it -  this->begin();
         return - 1 ;
    }

     void insert( int index,   const T t)
    {
         this->insert( this.begin() + index,  1, t);
    }
       

     void remove( const T t)
    {
         int pos = indexOf(t);
         if (pos >=  0)
             this->removeAt(pos);
    }

     void removeAt( int index)
    {
         if ( this->size() > index){
             this->erase( this->begin() + index,  this->begin() + index +  1);
        }
    }

     int count()
    {
         return  this->size();
    }

     void copyFrom(List<T> list)
    {
          this->assign(list.begin(), list.end());
    }
   
     void copyFromArray(NSArray *array){
          for( int i =  0; i< [array count]; i++){
             T t = (T)[array objectAtIndex:i];
              this->push_back(t);
         }
    }
   
     void copyFromArray( string* array){
         for( int i =  0; i< array->length(); i++){
            T t = (T)array[i];
             this->push_back(t);
        }
    }
   
     void copyFromArray( int* array){
         for( int i =  0; i<( sizeof(array)/ sizeof( int)); i++){
            T t = (T)array[i];
             this->push_back(t);
             // this->vector<T>::push_back(new T); // usage:用父類方法 或 static_cast<vector<T>*>(this)->push_back(T);
        }
    }
};



用法如下

    實例化對象並添加數據:
    List<NSString*> list;
    list.add( @" 1 ");
    list.add( @" 2代震軍 ");
    list.add( @" 333 ").add( @" 44444 ").add( @" 5 ");

    或用下面方式:
    NSArray *array = [[NSArray alloc] initWithObjects:
                       @" One ", @" Two ", @" Three ", @" Four ",nil];
    List<NSString*> list1(array);

    判斷是否存在某數據:
    NSString *del =  @" 44444 ";
     bool iscontains = list.contains(del);

     刪除數據:
    list.removeAt( 2);
    list.remove(del);

    遍歷:
     for(List<NSString*>::iterator it = list.begin() ;it != list.end() ; it++)
        cout << [(*it) UTF8String ]<< "   " ;

    或使用foreach:
    __block NSString* str;
    for_each(list.begin(), list.end(), ^(NSString *value){
        str = value;
        std::cout<<[value UTF8String]<<endl;
    });


    獲取指定索引記錄:
    NSString * result = list[ 0];


    代碼比較簡單,呵呵

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

    原文鏈接:http://www.cnblogs.com/daizhj/archive/2012/11/07/2758843.html

    作者: daizhj, 代震軍 
    微博: http://weibo.com/daizhj
    Tags:ios, c++, NSArray, NSMutableArray, vector


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM