我正在使用std::map(VC++实现),并且通过map的find方法查找速度有点慢.
关键类型是std::string.
我可以std::map通过地图的自定义键比较覆盖来提高此查找的性能吗?例如,std::string< string::size()compare在比较数据之前可能没有考虑简单的比较?
还有其他想法加快比较吗?
在我的情况下,地图将始终包含<15个元素,但是它会被不断地查询并且性能至关重要.也许有一个更好的数据结构,我可以使用更快?
更新:地图包含文件路径.
Update2:地图的元素经常变化.
这是受到有效C#第一版中的项目的启发,警告GetHashCode()天真地覆盖.
对不起,我没有支持代码.顺便说一句,这不是一个功课,我只是不熟悉C++/STL,也找不到有关实施的信息.
假设我创建了自己的名为person的类,它有3个公共可变字符串字段:
它还提供了一个小于运算符来比较一个人与另一个人的名字,首先是名字,然后是中间名,然后是姓氏 - 就是全部.
我创建了一个从人到int(比如年龄)的地图,并用大约20个键/值对填充它.我还存储指向数组中键的指针.然后我更改了第五个指针指向的对象的第一个名称,并尝试使用此修改的键查找相应的年龄(请记住该对象是可变的并且是大开的).
为什么会这样?
A)因为使用的密钥std::map没有改变(被复制),我改变了我自己的副本,现在找不到我的密钥.但这怎么可能呢?我没有提供自己的复制构造函数.也许默认的一个是由编译器创建的?
B)该std::map集合实际上是一个红黑树,我碰巧有一个直接指向键的指针.当我更改了密钥后,我直接在树的节点中更改了密钥.现在很可能我的节点没有正确定位,并且使用正确的树搜索算法无法找到它.我应该删除该节点,然后修改它们的密钥,然后再次重新插入它.如果是这种情况,那么我怀疑STL一般来说收藏是相当危险的,并且会导致新手出错.
C)还有别的吗?
我很感激你的见解.
我读过一本关于STL容器的标准分配器,如std :: list,std :: set,std :: multi_set,std :: map,e std :: multi_map,可以用更高性能的代替块分配器.
块分配器具有更高的性能,低碎片和高效的数据缓存.
我在网上发现FSBAllocator声称比标准更快. http://warp.povusers.org/FSBAllocator/
我已经尝试使用std :: map并且发现它看起来确实更快,但我的问题是如何使STL实现比特定分配器慢得多,并且除了标准之外,另一个分配器的缺点是什么?便携性和稳健性?我的代码必须在各种体系结构(win32,osx,linux)上编译.有人有这种固定大小的块分配器的经验吗?
将指针从a返回std::map::find到数据并使用它而不是获取数据副本是危险的吗?
目前,我得到一个指向我的地图中的条目的指针,并将其传递给另一个函数来显示数据.我担心项目移动导致指针变为无效.这是一个合法的问题吗?
这是我的示例函数:
MyStruct* StructManagementClass::GetStructPtr(int structId)
{
std::map<int, MyStruct>::iterator foundStruct;
foundStruct= myStructList.find(structId);
if (foundStruct== myStructList.end())
{
MyStruct newStruct;
memset(&newStruct, 0, sizeof(MyStruct));
myStructList.structId= structId;
myStructList.insert(pair<int, MyStruct>(structId, newStruct));
foundStruct= myStructList.find(structId);
}
return (MyStruct*) &foundStruct->second;
Run Code Online (Sandbox Code Playgroud)
}
据我所知,std :: map中值对中的键在插入后无法更改.这是否意味着使用键模板参数创建一个映射为const无效?
std::map<int, int> map1;
std::map<const int, int> map2;
Run Code Online (Sandbox Code Playgroud) 我正在寻找一个具有C++ std :: map常用实现特性的Java类(据我所知,它是一个自平衡二进制搜索树):
我正在寻找开源或设计文档的实现; 我可能最终会支持原始键/值.
这个问题的风格类似于:Java等价于std :: deque,其答案是"来自Java的原始集合的ArrayDeque".
我有一个存储带键的简单结构的地图.该struct有两个成员函数,一个是const而另一个不是.我已经使用std :: for_each管理调用const函数而没有任何问题,但是我在调用非const函数时遇到了一些问题.
struct MyStruct {
void someConstFunction() const;
void someFunction();
};
typedef std::map<int, MyStruct> MyMap;
MyMap theMap;
//call the const member function
std::for_each(theMap.begin(), theMap.end(),
boost::bind(&MyStruct::someConstFunction, boost::bind(&MyMap::value_type::second, _1)));
//call the non-const member function
std::for_each(theMap.begin(), theMap.end(),
boost::bind(&MyStruct::someFunction, boost::bind(&MyMap::value_type::second, _1)));
Run Code Online (Sandbox Code Playgroud)
对const成员函数的调用工作正常,但似乎boost内部需要一个const MyStruct,因此在MSVC7.1中出现以下编译错误.
boost\bind\mem_fn_template.hpp(151):错误C2440:'参数':无法从'const MyStruct*__ w64'转换为'MyStruct*const'
我非常感谢有关如何正确设置模板参数的任何帮助,因此bind会正确识别参数并让我调用非const函数.
谢谢,卡尔
我需要创建一个映射,其中空间中的特定键位置映射到对象列表. std::map似乎是这样做的方式.
所以我在键入一个std::mapxyzVector
class Vector
{
float x,y,z
} ;
Run Code Online (Sandbox Code Playgroud)
,我正在做一个std::map<Vector, std::vector<Object*> >.所以请注意,这里的关键不是 a std::vector,它的对象class Vector只是我自己制作的数学xyz向量.
为了产生"严格弱的排序",我写了以下重载operator<:
bool Vector::operator<( const Vector & b ) const {
// z trumps, then y, then x
if( z < b.z )
{
return true ;
}
else if( z == b.z )
{
if( y < b.y )
{
// z == b.z and y < b.y …Run Code Online (Sandbox Code Playgroud) 我有以下shared_ptr内容map:
std::shared_ptr<std::map<double, std::string>>
Run Code Online (Sandbox Code Playgroud)
我想用braced-init初始化它.可能吗?
我试过了:
std::string s1("temp");
std::shared_ptr<std::map<double, std::string>> foo = std::make_shared<std::map<double, std::string>>(1000.0, s1);
Run Code Online (Sandbox Code Playgroud)
但是在使用Xcode 6.3编译时会出现以下错误:
/usr/include/c++/v1/map:853:14: Candidate constructor not viable: no known conversion from 'double' to 'const key_compare' (aka 'const std::__1::less<double>') for 1st argument
Run Code Online (Sandbox Code Playgroud)
我已经尝试了第一个参数(1000.0)的其他变体而没有成功.
有人可以帮忙吗?
有人可以给出一个在 C++ 中返回 map 的函数的实际例子。
我尝试了其他帖子的答案,但我不知道如何申请。
这是我的工作代码:
auto DataArray = jvalue.at(U("data")).as_array();
//Make an associative array or map with key value pair from extracted json data
std::map<int, std::string> staffMap;
// loop through 'data' object
for (int i = 0; i < DataArray.size(); i++)
{
try
{
auto data = DataArray[i];
auto dataObj = data.as_object();
int key;
std::string value;
// loop through each object of 'data'
for (auto iterInner = dataObj.cbegin(); iterInner != dataObj.cend(); ++iterInner)
{
auto &propertyName = iterInner->first;
auto &propertyValue …Run Code Online (Sandbox Code Playgroud) stdmap ×10
c++ ×9
stl ×2
allocator ×1
binary-tree ×1
bind ×1
boost ×1
c++11 ×1
collections ×1
cpprest-sdk ×1
dictionary ×1
foreach ×1
function ×1
java ×1
math ×1
optimization ×1
performance ×1
pointers ×1
return ×1
shared-ptr ×1
std ×1
visual-c++ ×1