通过模板中的引用修改地图 class

Modify maps by reference in template class

大家好!

我有学校项目要做。在该项目中,我必须创建一个 map_storage 模板 class,它能够存储/知道它将要修改哪些地图并对它们执行不同的操作。

已经为我创建了 main.cpp 文件,因此我可以检查我的代码是否正确。

模板class:

#include <map>
#include <utility>
#include <vector>

#ifndef MAPALIGN_H
#define MAPALIGN_H

template<class Key, class T, class Compare = std::less<Key> >
class map_storage{
public:

    void add(std::map<Key, T, Compare> &temp_map){
        data_.push_back(temp_map);
    }

    void doSomething(){
        std::cout << data_.size() << std::endl;
        //This does something to all maps in the vector.
    }

private:
    std::vector<std::map<Key, T, Compare> > data_;

};

#endif

当我修改 data_ 中的映射(添加新键、值等)时,我也想查看 main 中的更改,反之亦然。

我的问题是如何在模板中存储地图的引用 class?

主要方法示例:

#include <iostream>
#include "mapalign.h"
#include <string>
#include <map>

int main()
{
  std::map<std::string, int> map1;
  
  map_storage<std::string int> ms;
  
  ms.add(map1);
  
  map1["asd"] = 1;
  map1["dsa"] = 2;
  

  ms.doSomething();
  //Tests that are checking that operations on map1 were finished on the map with size of 2 and not the empty one.

  .....

  return 0;
}

因此在 main.cpp 文件中,所有修改都必须显示在添加到模板的地图参考中 class。

在这种情况下,doSomething() 函数对具有“asd”1、“dsa”2 个键值对的地图执行某些操作,而不仅仅是之前添加到向量中的地图的空副本.

在 doSomething() 操作期间,我们必须知道所有地图数据才能相应地修改其他地图中的数据。

如果有人对这个问题有任何想法,我将不胜感激。

(我知道c++不支持在数组和向量中存储引用,所以一定有另一种我想不通的方法)

再次感谢。

我们不能有左值引用向量。您可以改为将指针存储在向量中,如下所示:

template<class Key, class T, class Compare = std::less<Key> >
class map_storage{
public:
//------------------------------------v--------------->pointer
    void add(std::map<Key, T, Compare>* temp_map){
        data_.push_back(temp_map);
    }

    void doSomething(){

        std::cout << data_.size() << std::endl;
        std::cout<< data_.at(0)->size(); //prints 2
        
    }

private:
//---------------------------------------v------------->pointer
    std::vector<std::map<Key, T, Compare>* > data_;

};

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

  map_storage<std::string, int> ms;
//-----------------------^----------->added comma here which was missing in the original code
  
  ms.add(&map1);
  
  map1["asd"] = 1;
  map1["dsa"] = 2;
  
  
  ms.doSomething();
  
}

Working demo

此外,请确保您没有取消引用指向不再存在的对象的指针。

方法二

template<class Key, class T, class Compare = std::less<Key> >
class map_storage{
public:
//------------------------------------v--------------->reference
    void add(std::map<Key, T, Compare>& temp_map){
        data_.push_back(&temp_map);
    }

    void doSomething(){

        std::cout << data_.size() << std::endl;
        std::cout<< data_.at(0)->size(); //prints 2
        
    }

private:
//---------------------------------------v------------->pointer
    std::vector<std::map<Key, T, Compare>* > data_;

};

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

  map_storage<std::string, int> ms;
//-----------------------^----------->added comma here which was missing in the original code
  
  ms.add(map1);
  
  map1["asd"] = 1;
  map1["dsa"] = 2;
  
  
  ms.doSomething();
  
}

Working demo