【问题标题】:How to pass 2D map as a pointer to function如何将 2D 地图作为指向函数的指针传递
【发布时间】:2011-01-15 19:59:12
【问题描述】:

我有两张地图:

map<int, map<int, int> > m1;
map<int, map<int, int> > m2;

并想用函数填充它们:

void fillMaps (m1, m2) {
    * m1[0][0] = 5;
    * m2[0][1] = 4;
}

我应该如何将这些映射传递给函数? 我猜变量本身可以像这样传递:

map<int, map<int, int> > m1;
map<int, map<int, int> > m2;

fillMaps(m1, m2);

但是我应该如何定义函数内部的变量类型才能改变地图的值呢?

【问题讨论】:

    标签: c++ pointers map


    【解决方案1】:

    要更改函数中的映射,您需要通过引用传递它们:

    void fillMaps (map<int, map<int, int> >& m1, map<int, map<int, int> >& m2) {
        m1[0][0] = 5;
        m2[0][1] = 4;
    }
    

    请注意,右尖括号之间有空格,以防止出现奇怪的编译器错误。另请注意,通过引用传递,您不需要使用任何指针取消引用;这是自动处理的。

    【讨论】:

      【解决方案2】:

      您可以通过引用或指针传递映射来修改值。

      void fillMapsByReference (
          std::map<int, map<int, int> >& m1,
          std::map<int, map<int, int> >& m2)     {
          m1[0][0] = 5;
          m2[0][1] = 4;
      }
      
      void fillMapsByPointer (
          std::map<int, map<int, int> >* m1,
          std::map<int, map<int, int> >* m2)     {
          *m1[0][0] = 5;
          *m2[0][1] = 4;
      }
      

      【讨论】:

      • 我不敢相信每个人都选择参考方法。在我看来,指针方法非常可取,因为它是明确的。请参阅 Google C++ 指南——“所有通过引用传递的参数必须标记为 const”。
      【解决方案3】:

      我将提供与其他人不同的答案。您可以使用 C++ 模板并让编译器自动为您推断类型:

      template <typename T>
      void fillMaps (T& m1, T& m2) {
          m1[0][0] = 5;
          m2[0][1] = 4;
      }
      

      这样称呼它:

      map<int, map<int, int> > m1;
      map<int, map<int, int> > m2;
      
      fillMaps(m1, m2);
      

      通过这种方式,您可以通过引用传递地图。此外,如果您稍后更改地图的类型(例如使用另一个地图实现或使用字符串而不是整数),则不必更改此函数。

      【讨论】:

        【解决方案4】:

        使用typedef 让代码更干净:

        typedef map<int, map<int, int> > intmap;
        
        void fillMaps(intmap &m1, intmap &m2)
        {
             m1[0][0] = 5;
             m2[0][1] = 4;
        }
        

        【讨论】:

        • 参见@Leonid 下面的指针参数方法。更好的是,在我看来,可写的引用传递并不是一种好的风格。
        【解决方案5】:

        这是我的方法:

        template <typename T>
        class MapOfMaps
        {
          public:
            // ...
        
          private:
            map<T, map<T, T> > m;
        };
        
        typedef MapOfMaps<int> MapOfIntMap;
        
        void fillmap(MapOfIntMap& m1, MapOfIntMap& m2)
        {
        //...
        }
        

        【讨论】:

          【解决方案6】:

          通过引用传递值。另外,您需要在fillMaps中声明m1和m2的类型。

          void fillMaps(map&ltint, map&ltint,int&gt &gt &ampm1, map&ltint, map&ltint,int&gt &gt &ampm2)
          {
               // fill map code in here
               m1[0][0] = 5;
               m2[0][1] = 4;
          }
          

          然后,调用使用fillMaps(m1, m2);

          【讨论】:

          • 在 C++0x 中工作,但请注意代码示例不是有效的 C++ 2003 代码 - >> 在模板规范中是非法的。
          猜你喜欢
          • 2019-08-17
          • 1970-01-01
          • 2013-11-18
          • 2021-10-05
          • 2010-11-19
          • 2013-09-02
          • 1970-01-01
          • 1970-01-01
          • 2015-08-05
          相关资源
          最近更新 更多