2010-09-30 4 views
1

Je dois utiliser la mappe STL C++ pour stocker les paires de valeurs clés. J'ai besoin de stocker plus d'une information de données dans la carte stl. par exempleComment utiliser la paire valeur/clé STL non triée en tant que paire dans la carte

Besoin de stocker DataType, Data et son comportement comme (dans param/outparam) tous en format de chaîne. Mais carte toujours utiliser la valeur paire de clés

donc si je stocker comme

std::map<map<"int","50",>"behavior">. 

Mais toujours trie les données sur la base de clés que je ne veux pas. Si j'utilise comme ..

pair<string, pair<string,string> >; 
pair<string, pair<string,string>>("int",("100","in")); 

Cela demande une erreur de compilation!

erreur C2664: 'std :: paire < _Ty1, _Ty2> :: paire (const std :: paire < _Ty1, _Ty2> &)': ne peut pas convertir le paramètre 1 de 'const char *' à « const std: : paire < _Ty1, _Ty2> & '

Quelle devrait être la solution exacte du problème ci-dessus?

Cordialement

+0

Ne comprenez pas tout à fait votre problème, mais est-ce un 'std :: multimap' que vous voulez? –

+0

Je pense que le plus gros problème n'est pas C++ ou 'std :: map', mais comprend la question. Et je suis enclin à penser (du petit code que je vois) qu'Usman ne le comprend pas non plus. "paire clé-valeur non triée" n'a pas de sens. Un _collection_ peut être trié, mais un seul élément ne peut pas. – MSalters

Répondre

4

Si vous ne souhaitez pas commander, n'utilisez pas de conteneurs commandés tels que carte ou ensemble. Vous pourriez réaliser ce que vous cherchez en utilisant une classe et un vecteur. La nature triée de std :: map est ce qui rend efficace la recherche par clé. Si vous voulez/avez besoin d'un comportement non trié et d'un comportement de hachage similaire pour les recherches, regardez Boost unordered containers. Notez que cela ne garantit pas que la commande sera en cours. Je suppose que vous voulez préserver l'ordre des types que vous mettez dans le conteneur, l'exemple ci-dessous le fera.

#include <iostream> 
#include <vector> 

using namespace std; 

class DataBehavior 
{ 
public: 
    DataBehavior(const string &type, 
       const string &data, 
       const string &behavior) 
     :type(type), data(data), behavior(behavior) 
    { 
    } 

    const string &getType() const  { return type; } 
    const string &getData() const  { return data; } 
    const string &getBehavior() const { return behavior; } 

private: 
    string type; 
    string data; 
    string behavior; 
}; 

typedef vector<DataBehavior> Ctr; 

int main (int argc, char *argv[]) 
{ 
    Ctr ctr; 
    ctr.push_back(DataBehavior("int", "50", "behavior")); 
    ctr.push_back(DataBehavior("int", "80", "behavior")); 
    ctr.push_back(DataBehavior("string", "25", "behavior2")); 

    for (Ctr::const_iterator it = ctr.begin(); it != ctr.end(); ++it) 
    { 
     cout << "Type: " << it->getType() << " " 
      << "Data: " << it->getData() << " " 
      << "Behavior: " << it->getBehavior() << "\n"; 
    } 
    return 1; 
} 
1

Nécessité de stocker DataType, données et son comportement comme (dans param/outparam) tous dans format de chaîne. Mais toujours utiliser la carte paire de clés de valeur

Pour moi, il semble que vous avez besoin d'utiliser différentes structures de données, par exemple

typedef std::tuple<std::string,    // DataType 
        std::string,    // Data 
        std::string> element_type; // behaviour 

// use can replace tuple with sth like: 
//struct element_type { 
// std::string m_DataType; 
// std::string m_Data; 
// std::string m_Behaviour; 
// ... ctors, operators ... 
//}; 
// or even with std::array<std::string, 3> 

std::set<element_type> elements_set; 

// or 

typedef int32_t element_id; 

std::map<element_id, element_type> elements_map; 

Et vous avez plutôt un problème de conception que de programmation.

2

Vous déclarer les variables mal dans le

pair<string, pair<string,string> >; 
pair<string, pair<string,string>>("int",("100","in")); 

Vous auriez besoin de faire

pair<string, pair<string,string>>("int",pair<string,string>("100","in")); 

qui est assez bavard. Vous pouvez utiliser la fonction make_pair pour réduire de manière significative que:

make_pair("int", make_pair("100", "in")); 

En outre, comme les autres l'ont dit, si vous ne voulez pas l'ordre de tri, utilisez unordered_map de TR1 ou Boost. Si vous êtes sur MS, vous pouvez utiliser hash_map à la place.

+0

+1 pour être la seule réponse qui adresse le message d'erreur réel. –

+0

Ci-dessus sémantique pour l'utilisation de la paire de valeur clé a bien fonctionné. Mais je vais concevoir classe ou struct inorder pour stocker des données selon mes besoins. – Usman

1

Pourquoi utilisez-vous une carte en premier lieu?Que voulez-vous utiliser comme clé de recherche - le type de données? La valeur? La caractéristique "param/outparam"? Tout ce que vous voulez utiliser comme clé devrait aller en premier, et le reste pourrait être un struct/pointer/string (* urgence *)/....

Je vous suggère de donner un peu plus réfléchi à vos besoins et concevoir une structure de données en conséquence.

+0

Merci d'avoir répondu et de donner des conseils utiles. – Usman

Questions connexes