map std 浮点数索引_C std :: map持有任何类型的值
Blindy的答案非常好(1),但只是为了完成答案:通过使用动态继承,还有另一种方法可以在没有库的情况下完成:
class MyFieldInterface
{
int m_Size; // of course use appropriate access level in the real code...
~MyFieldInterface() = default;
}
template
class MyField : public MyFieldInterface {
T m_Value;
}
struct MyClass {
std::map fields;
}
优点:
>任何C编码器都很熟悉
>它不会强迫你使用Boost(在某些情况下你不被允许);
缺点:
>你必须在堆/免费存储上分配对象,并使用引用语义而不是值语义来操作它们;
>以这种方式暴露的公共继承可能导致动态继承的过度使用,并且与您的类型相关的许多长期问题实际上过于依赖;
>如果必须拥有对象,指针向量是有问题的,因为你必须管理破坏;
因此,如果可以,请使用boost :: any或boost :: variant作为默认值,否则仅考虑此选项.
要修复最后一个缺点,你可以使用智能指针:
struct MyClass {
std::map > fields; // or shared_ptr<> if you are sharing ownership
}
但是,仍然存在一个可能更有问题的问题:
它强制您使用new / delete(或make_unique / shared)创建对象.这意味着实际对象是在分配器提供的任何位置(主要是默认值)的免费存储(堆)中创建的.因此,由于cache misses,经常访问对象列表的速度并不快.
如果你经常关注循环遍历此列表的性能(如果没有,则忽略以下内容),那么你最好使用boost :: variant(如果你已经知道将要使用的所有具体类型)或者使用某种类型擦除的多态容器.
这个想法是容器将管理相同类型的对象数组,但仍然暴露相同的接口.该接口可以是一个概念(使用鸭子类型技术)或动态接口(像我的第一个例子中的基类).
优点是容器将相同类型的对象保存在单独的向量中,因此通过它们很快.只从一种类型到另一种类型不是.
但是,如果您需要保持插入对象的顺序,这种技术就会失去兴趣.
无论如何,有几种可能的解决方案,这在很大程度上取决于您的需求.如果你对你的案例没有足够的经验,我建议使用我在我的例子中首先解释的简单解决方案或者boost :: any / variant.
作为这个答案的补充,我想指出非常好的博客文章,总结了你可以使用的所有C类型擦除技术,评论和优点/缺点:
map std 浮点数索引_C std :: map持有任何类型的值相关推荐
- map std 浮点数索引_std:map中的浮点键
呼如林 因此在使用double作为键时存在一些问题std::map.首先,NaN比它本身少的是一个问题.如果有NaN插入的机会,请使用以下方法:struct safe_double_less { b ...
- map multimapc++_C++的Map和Multimap
广州C++培训的小编这一期给大家讲Map和Multimap. 6.6 Maps和Multimaps map和multimap将key/value pair当作元素进行管理.他们可根据key的排序准则自 ...
- move std 函数 示例_C++11右值引用和std::move语句实例解析(推荐)
右值引用(及其支持的Move语意和完美转发)是C++0x将要加入的最重大语言特性之一.从实践角度讲,它能够完美解决C++中长久以来为人所诟病的临时对象效率问题.从语言本身讲,它健全了C++中的引用类型 ...
- jquery中的map()方法与js中的map()方法
1.jquery中的map()方法 首先看一个简单的实例: $("p").append( $("input").map(function(){ return $ ...
- javascript java map_javascript实现java的map对象,js实现new map()
/* * MAP对象,实现MAP功能 * * 接口: * size() 获取MAP元素个数 * isEmpty() 判断MAP是否为空 * clear() 删除MAP所有元素 * ...
- golang 使用map处理多级json后输出map中的数组
/** @Descripttion:* @version:* @Author: 步荀仙* @Date: 2019-10-30 15:41:34* @LastEditors: 步荀仙* @LastEdi ...
- Fastjson 序列化,反序列化Map对象排序问题(字符串转map,map转字符串)
版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/qingfeng812/article/details/61194594 背景 记录项目中遇到的 关于 ...
- no match for call to ‘(std::__cxx11::string {aka std::__cxx11::basic_string
问题: t->package().ship_id(sqlRow[1]); 其中 ship_id为 结构体package中的string类型. 如下: typedef struct Packag ...
- string转map集合_[系列文章] Go - Map 集合
概述 Map 集合是无序的 key-value 数据结构. Map 集合中的 key / value 可以是任意类型,但所有的 key 必须属于同一数据类型,所有的 value 必须属于同一数据类型, ...
最新文章
- MPB:林科院袁志林组-​枫香-真菌互作培养体系构建
- java.net.ConnectException: Connection refused 异常
- numpy.sum详解
- boost::mpi::wait_any相关用法的测试程序
- C++中函数模板的用法详细解析
- spring常见面试问题_Spring面试问题
- mysql数据库日志截断,MySQL基础(十一):查询截取分析
- React 折腾记 - (4) 侧边栏联动Tabs菜单-增强版(结合Mobx)
- (42)Xilinx FIFO IP核配置(三)(第9天)
- 如何理解《瓦尔登湖》?
- 启牛商学院计算机,启牛商学院达摩老师教你三招成为跨界理财达人
- LeetCode 49. Group Anagrams
- Cronbach’s α?KMO系数?因子载荷?史上最易懂的问卷信效度分析教程!!!(SPSS和AMOS)
- 【原创】【2021 android逆向系列】番外:oppo A57手机刷官方纯净版ROM且ROOT
- 用C#语言实现记事本(代码)
- 多元时间序列因果关系分析
- 理解和应用向量积与数量积
- Visual Studio日文乱码解决方法
- 风起亚洲公共云与VPS比较
- Linux之创建组名和删除组名