2012-01-20 14 views
6

estoy empezando a trabajar en un proyecto de Objective-C++, obtener una idea de cómo la síntesis de las dos lenguas se siente antes de hacer cualquier diseño de alta resistencia. Estoy muy intrigado por la forma de conteo automatizado de referencia se ha integrado con C++: se obtiene el equivalente de punteros inteligentes para NSObjects que se encargan de retener/liberar adecuadamente en contenedores STL (véase el artículo de David Chisnall en http://www.informit.com/articles/article.aspx?p=1745876&seqNum=3).Cómo utilizar NSString como clave en Objective-C++ std :: mapa

Quiero usar un mapa STL como una asignación de typesafe NSStrings a valores de C++. Puedo declarar una asignación como

std::map<NSString*, MyType> mapping 

Con ARC, esta asignación maneja la administración de la memoria correctamente. Pero no sigue la semántica de valores NSString correctamente, porque está utilizando comparaciones de punteros en lugar de -[NSString compare:].

Cuál es la mejor manera de conseguir un mapa de STL para usar la comparación de cadenas en lugar de la comparación puntero?
¿Debo tratar de especializarme std::less<NSString*>?
¿Debo declarar un comparador explícito como std::map<NSString*, MyType, MyCompare>?
¿Debo envolver los NSString* llaves en un puntero inteligente que implementa operator<?

+0

¿cómo definir mejor? ¿Cuál es la memoria de velocidad de resultado deseada? – madmik3

+0

Interesante. No tenía idea de que los punteros objc funcionarían tan fácilmente con ARC. Al mirar el artículo de Chisnall, tendrá que agregar __weak o __strong a su declaración de mapa para que funcione. De lo contrario, son POD y no funcionará. (No tengo una respuesta para el problema de la comparación porque lo hago con poca frecuencia y olvido los términos posteriores. Lo probaría en el orden que usted dio.) – smparkes

+0

Creo que si los indicadores son fuertes, no tiene que marcarlos, solo si son débiles De todos modos, iría con un comparador explícito. – bames53

Respuesta

9

te gustaría un objeto de comparación personalizada que llama función de comparación de NSString, algo como esto:

#include <functional> 
#include <map> 

struct CompareNSString: public std::binary_function<NSString*, NSString*, bool> { 
    bool operator()(NSString* lhs, NSString* rhs) const { 
     if (rhs != nil) 
      return (lhs == nil) || ([lhs compare: rhs] == NSOrderedAscending); 
     else 
      return false; 
    } 
}; 

std::map<NSString*, MyType, CompareNSString> mapping; 
+0

¡Gracias por el consejo! El mapeo funciona bien con el objeto de comparación. Cambié la condición para usar un ordenamiento consistente para nils (ordenan primero, antes de cadenas vacías). –

0

comparaciones de puntero no administrados NSString casos están bien, si son todos NSString literales. Por el contrario, esto funcionaría en MRC en esas condiciones, siempre que, por supuesto, no haya valores de cadena duplicados, y el valor es lo que se está comparando.

si no, véase la respuesta generalmente más útil Ross (1).

Cuestiones relacionadas