Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/162.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何在调用映射上的函数后将右值插入映射中_C++_C++11_Visual C++_Std_C++ Standard Library - Fatal编程技术网

C++ 如何在调用映射上的函数后将右值插入映射中

C++ 如何在调用映射上的函数后将右值插入映射中,c++,c++11,visual-c++,std,c++-standard-library,C++,C++11,Visual C++,Std,C++ Standard Library,我正在尝试使用std::unordered_map(以下简称map),以便能够使用map根据不同对象的名称在不同对象上调用相同的函数。映射中的函数指针是实现这一点的一种方法,但我认为将对象本身保存在映射中会更干净 现在,对象存储在共享的\u ptr中,因为它们具有来自其他用途的依赖项(在函数调用之前自动调用的成员函数等),并且共享的\u ptr是使用一个包装使\u共享的的函数分配的,该函数会重置它,以及捕获和抛出带有附加相关信息的异常(可能不再需要,但它是一个相当大的代码库,并且是编码标准的一部

我正在尝试使用
std::unordered_map
(以下简称map),以便能够使用map根据不同对象的名称在不同对象上调用相同的函数。映射中的函数指针是实现这一点的一种方法,但我认为将对象本身保存在映射中会更干净

现在,对象存储在
共享的\u ptr
中,因为它们具有来自其他用途的依赖项(在函数调用之前自动调用的成员函数等),并且
共享的\u ptr
是使用一个包装
使\u共享的
的函数分配的,该函数会重置它,以及捕获和抛出带有附加相关信息的异常(可能不再需要,但它是一个相当大的代码库,并且是编码标准的一部分)。此函数通过引用
共享\u ptr
来分配给定对象,并返回void

我想做的是创建一个映射到对象的键的映射,并对所有这些对象调用allocate函数。但是由于allocate函数不返回OutputIterator或类似的东西,因此我无法使用
std::inserter

我不想这样做的方式是使用左值,比如:

std::map<std::string, std::shared_ptr<CObject>> objectMap;
shared_ptr< CObject> object;
allocate< CObject>( object );
objectMap.insert( make_pair("FirstObject", object ) );

还有其他想法吗?

您可以使用这样的函数对象来创建地图元素:

struct AllocCObject {
  std::pair<const std::string, std::shared_ptr<CObject>>
  operator()(const std::string& key) const
  {
    std::shared_ptr<CObject> p;
    allocate<CObject>(p);
    return { key, p };
  }
};

std::string keys[] =  { "k1", "k2", "k3" };
std::map<std::string, std::shared_ptr<CObject>> map;
std::transform(std::begin(keys), std::end(keys), std::inserter(map), AllocCObject());
struct allocobject{
std::pair
运算符()(常量std::字符串和键)常量
{
std::共享的ptr p;
分配(p);
返回{key,p};
}
};
字符串键[]={“k1”、“k2”、“k3”};
地图;
std::transform(std::begin(键)、std::end(键)、std::inserter(映射)、allocobject());
或者,如果您更喜欢使用lambda而不是函数对象:

auto allocObject = [] (std::string const& s) {
  std::shared_ptr<CObject> p;
  allocate<CObject>(p);
  return std::make_pair(s, p);
} 
auto allocObject=[](std::string const&s){
std::共享的ptr p;
分配(p);
返回std::生成一对(s,p);
} 
或者,更接近你的想法(我觉得不错):

std::map={
{“k1”、{}、{“k2”、{}、{“k3”、{}
};
用于(自动和电子:地图)
分配(如第二次);

(注意,我不认为VC++支持从类似的
初始值设定项列表中初始化映射,但它是有效的C++11。)

您可以使用这样的函数对象来创建映射元素:

struct AllocCObject {
  std::pair<const std::string, std::shared_ptr<CObject>>
  operator()(const std::string& key) const
  {
    std::shared_ptr<CObject> p;
    allocate<CObject>(p);
    return { key, p };
  }
};

std::string keys[] =  { "k1", "k2", "k3" };
std::map<std::string, std::shared_ptr<CObject>> map;
std::transform(std::begin(keys), std::end(keys), std::inserter(map), AllocCObject());
struct allocobject{
std::pair
运算符()(常量std::字符串和键)常量
{
std::共享的ptr p;
分配(p);
返回{key,p};
}
};
字符串键[]={“k1”、“k2”、“k3”};
地图;
std::transform(std::begin(键)、std::end(键)、std::inserter(映射)、allocobject());
或者,如果您更喜欢使用lambda而不是函数对象:

auto allocObject = [] (std::string const& s) {
  std::shared_ptr<CObject> p;
  allocate<CObject>(p);
  return std::make_pair(s, p);
} 
auto allocObject=[](std::string const&s){
std::共享的ptr p;
分配(p);
返回std::生成一对(s,p);
} 
或者,更接近你的想法(我觉得不错):

std::map={
{“k1”、{}、{“k2”、{}、{“k3”、{}
};
用于(自动和电子:地图)
分配(如第二次);

(注意:我不认为VC++支持从
初始值设定项\u list
那样初始化映射,但它是有效的C++11。)

“但是由于分配函数不返回输出迭代器或类似的东西,我无法使用
std::inserter
”我没有遵循这一点-你能说明你希望做什么吗,但是不能吗?是否可以在地图上循环两次,一次用键填充,另一次填充指针?钥匙是从哪里来的?我现在已经添加了更多的信息,希望它更容易理解我想做什么。这更清楚了,谢谢。你的解决方案看起来不错,但我在回答中又增加了一个。我的
transform
建议也应该适用。“但是,由于分配函数不返回outputierator或类似的东西,我无法使用
std::inserter
”我没能理解这一点-你能告诉我你希望做什么,但不能吗?是否可以在地图上循环两次,一次用键填充,另一次填充指针?钥匙是从哪里来的?我现在已经添加了更多的信息,希望它更容易理解我想做什么。这更清楚了,谢谢。你的解决方案看起来不错,但我在回答中又增加了一个。我的
transform
建议也应该适用。对于地图中的每个值,键都将被硬编码,并且地图可能只包含5-6个值。谢谢,我非常喜欢转换解决方案,因为这样可以让我创建向量,并在一个漂亮简洁的位置定义键。可以通过lambda而不是函数对象来实现这一点,对吗?在VC++中不支持初始值设定项列表的问题上,您是对的,很遗憾,这是不允许的。是的,您可以用lambda替换函子,例如
[](std::string const&s){std::shared_ptr p;allocate(p);return std::make_pair(s,p)}
再次感谢!我将lambda答案添加到原始答案中!由于某种原因,您的编辑被拒绝了,我猜审阅者没有阅读评论,所以我自己添加了它。地图中的每个值的键都将被硬编码,并且地图可能只包含5-6个值。谢谢,我确实喜欢转换解决方案,因为这样可以让我创建向量并在一个漂亮简洁的位置定义键。可以通过lambda而不是函数对象来实现这一点,对吗?在VC++中不支持初始值设定项列表的问题上,您是对的,很遗憾,这是不允许的。是的,您可以用lambda替换函子,例如
[](std::string const&s){std::shared_ptr p;allocate(p);return std::make_pair(s,p)}
再次感谢!我将lambda答案添加到原始答案中!你的编辑因为某种原因被拒绝了,我猜评论员没有阅读评论,所以我自己添加了它