2010-12-03 4 views
0
SKU1  SKU2  Description 
"" "34545"  "White Bread" 
"01545" "34236"  "Wheat Bread" 

J'ai besoin de recouper ces trois domaines, à savoir récupérer SKU2 tout en sachant SKU1, SKU1 tout en sachant SKU2, et description tout en sachant soit SKU1 ou SKU2.Stockage et l'accès à une collection de chaînes (STD C++)

Je suis curieux - quelle est la meilleure façon de faire cela? Vecteurs utilisant search() ou find()? En utilisant une carte en quelque sorte?

Je l'ai actuellement en train d'utiliser un vector< vector<string> >, en passant par les vecteurs «parents» et les vecteurs «enfant», en comparant les valeurs, mais cela semble primitif.

Fondamentalement, j'ai besoin d'un vecteur qui utilise l'une de ses chaînes comme un index pour retourner l'une des deux autres valeurs. Est-ce que la façon générale dont je le fais est considérée acceptable/optimale?

vector< vector<string> > products; 

int i = 0; 
for(i = 0; i < 2; ++i) 
{ 
    products.push_back(vector<string>()); 

    products[i].push_back("SKU1"); 
    products[i].push_back("SKU2"); 
    products[i].push_back("Description"); 

} 

Merci pour votre aide.

+0

Pourriez-vous utiliser des bibliothèques externes ou vous êtes coincé avec la bibliothèque standard uniquement? – AraK

+0

Je pourrais utiliser une bibliothèque externe, mais je préférerais utiliser STD autant que possible. – Smurf64

Répondre

0

Construire trois std::map<std::string, std::string> s: un pour mapper SKU1s aux SKU2s, un pour mapper SKU1s aux descriptions, et un pour mapper SKU2s aux Descriptions. (Mieux encore, utilisez std :: unordered_map, si vous l'avez (C++ 0x)).

Cela suppose que vous avez beaucoup de données et privilégiez la vitesse plutôt que l'utilisation de la mémoire.

+0

Merci! Comment récupérer SKU2 à partir de SKU1? Aurais-je besoin d'une autre carte dans l'autre sens, ou existe-t-il un moyen de récupérer une clé à partir d'une valeur? – Smurf64

1

Je vous recommande d'utiliser deux cartes qui index dans un objet qui contient les informations dont vous avez besoin:

struct MyInfo 
{ 
    std::string SKU1; 
    std::string SKU2; 
    std::string Description; 
}; 

std::map<std::string, MyInfo *> SKU1map; 
std::map<std::string, MyInfo *> SKU2map; 

MyInfo * newProduct = new MyInfo; ///Do not forget to delete!! 
newProduct->SKU1 = //SKU1 value 
newProduct->SKU2 = //SKU2 value 
newProduct->Description = //Description value 

SKU1map[newProduct->SKU1] = newProduct; 
SKU2map[newProduct->SKU2] = newProduct; 

Ce sera une mise en œuvre décemment rapide (beaucoup mieux que la recherche linéaire), et Si vous traitez de nombreuses instances de produits, la mémoire sera plus efficace.

+0

Wow. Idée très intéressante. Je ne pense pas qu'il existe un moyen de faire quelque chose de similaire sans pointeurs ... – Smurf64

+1

Pourquoi voudriez-vous le faire sans pointeurs? :) Vous pouvez le faire en poussant vos structures sur un vecteur par exemple, puis utilisez simplement des pointeurs dans vos cartes pour les référencer, de cette façon vous n'aurez pas besoin de les libérer manuellement par la suite, mais vous utiliserez toujours les pointeurs dans les cartes sinon vous allez dupliquer les données partout. –

+0

@Strahd_za: Si vous faites cela, vous devrez prédéfinir la taille du vecteur afin que les pointeurs ne soient pas invalidés lorsque vous ajoutez de nouveaux éléments. –

Questions connexes