2013-07-14 6 views
1

Est-il possible de faire une carte 2D?Carte C++ 2d? Comme un tableau 2d?

Comme ceci:

map< int, int, string> testMap; 

et en remplissant les valeurs serait comme:

testMap[1][3] = "Hello"; 

Merci pour votre temps :)

Répondre

8

Vous pouvez imbriquer deux cartes:

#include <iostream> 
#include <map> 
#include <string> 

int main() 
{ 
    std::map<int,std::map<int,std::string>> m; 

    m[1][3] = "Hello"; 

    std::cout << m[1][3] << std::endl; 

    return 0; 
} 
+0

Cela a fonctionné parfaitement :) Merci. Je vais accepter la réponse dès que possible. – mrg95

13

oui, utilisez std::pair

map< std::pair<int, int>, string> testMap; 
testMap[std::make_pair(1,3)] = "Hello"; 
+0

Intéressant. Normalement, je pourrais utiliser ceci, cependant j'utilise réellement le créateur de Qt ainsi je ne pense pas qu'ils ont la bibliothèque standard. Ils pourraient avoir quelque chose de similaire, mais idk. Par exemple, au lieu d'utiliser std :: map, j'utilise QMap. Heureusement que la syntaxe était la même – mrg95

+1

Qt Creator est juste un IDE (environnement de développement intégré), pas un compilateur ou une forme différente de C++. Ainsi, même si Qt Creator est utile pour gérer la bibliothèque Qt, qui définit QMap, vous pouvez toujours écrire du C++ standard (par exemple en utilisant std :: map) dans Qt Creator et le compiler correctement. –

+0

Ce sera considérablement plus efficace que la solution RyanMcK. –

1

Dans le cas où il est utile pour tout le monde, voici le code pour une classe qui se base sur la réponse de andre, qui permet l'accès par l'intermédiaire d'opérateurs de support comme un tableau 2D régulière serait:

template<typename T> 
class Graph { 
/* 
    Generic Graph ADT that uses a map for large, sparse graphs which can be 
    accessed like an arbitrarily-sized 2d array in logarithmic time. 
*/ 
private: 
    typedef std::map<std::pair<size_t, size_t>, T> graph_type; 
    graph_type graph; 
    class SrcVertex { 
    private: 
     graph_type& graph; 
     size_t vert_src; 
    public: 
     SrcVertex(graph_type& graph): graph(graph) {} 
     T& operator[](size_t vert_dst) { 
      return graph[std::make_pair(vert_src, vert_dst)]; 
     } 
     void set_vert_src(size_t vert_src) { 
      this->vert_src = vert_src; 
     } 
    } src_vertex_proxy; 
public: 
    Graph(): src_vertex_proxy(graph) {} 
    SrcVertex& operator[](size_t vert_src) { 
     src_vertex_proxy.set_vert_src(vert_src); 
     return src_vertex_proxy; 
    } 
};