通过模板中的引用修改地图 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();
}
此外,请确保您没有取消引用指向不再存在的对象的指针。
方法二
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();
}
大家好!
我有学校项目要做。在该项目中,我必须创建一个 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();
}
此外,请确保您没有取消引用指向不再存在的对象的指针。
方法二
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();
}