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);
}
}
};
#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 ");
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);
@" One ", @" Two ", @" Three ", @" Four ",nil];
List<NSString*> list1(array);
判斷是否存在某數據:
NSString *del =
@"
44444
";
bool iscontains = list.contains(del);
bool iscontains = list.contains(del);
刪除數據:
list.removeAt(
2);
list.remove(del);
list.remove(del);
遍歷:
for(List<NSString*>::iterator it = list.begin() ;it != list.end() ; it++)
cout << [(*it) UTF8String ]<< " " ;
cout << [(*it) UTF8String ]<< " " ;
或使用foreach:
__block NSString* str;
for_each(list.begin(), list.end(), ^(NSString *value){
str = value;
std::cout<<[value UTF8String]<<endl;
});
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