标签: stdmap

如何在密钥类型为std :: string的地图查找中提高性能?

我正在使用std::map(VC++实现),并且通过map的find方法查找速度有点慢.

关键类型是std::string.

我可以std::map通过地图的自定义键比较覆盖来提高此查找的性能吗?例如,std::string< string::size()compare在比较数据之前可能没有考虑简单的比较?

还有其他想法加快比较吗?

在我的情况下,地图将始终包含<15个元素,但是它会被不断地查询并且性能至关重要.也许有一个更好的数据结构,我可以使用更快?

更新:地图包含文件路径.

Update2:地图的元素经常变化.

c++ optimization dictionary stdmap visual-c++

9
推荐指数
3
解决办法
2万
查看次数

当`key/value`被插入`std :: map`时,它是否自己创建了对象的副本?

这是受到有效C#第一版中的项目的启发,警告GetHashCode()天真地覆盖.

对不起,我没有支持代码.顺便说一句,这不是一个功课,我只是不熟悉C++/STL,也找不到有关实施的信息.

假设我创建了自己的名为person的类,它有3个公共可变字符串字段:

  • 名字,
  • 中间初始

它还提供了一个小于运算符来比较一个人与另一个人的名字,首先是名字,然后是中间名,然后是姓氏 - 就是全部.

我创建了一个从人到int(比如年龄)的地图,并用大约20个键/值对填充它.我还存储指向数组中键的指针.然后我更改了第五个指针指向的对象的第一个名称,并尝试使用此修改的键查找相应的年龄(请记住该对象是可变的并且是大开的).

为什么会这样?

A)因为使用的密钥std::map没有改变(被复制),我改变了我自己的副本,现在找不到我的密钥.但这怎么可能呢?我没有提供自己的复制构造函数.也许默认的一个是由编译器创建的?

B)该std::map集合实际上是一个红黑树,我碰巧有一个直接指向键的指针.当我更改了密钥后,我直接在树的节点中更改了密钥.现在很可能我的节点没有正确定位,并且使用正确的树搜索算法无法找到它.我应该删除该节点,然后修改它们的密钥,然后再次重新插入它.如果是这种情况,那么我怀疑STL一般来说收藏是相当危险的,并且会导致新手出错.

C)还有别的吗?

我很感激你的见解.

c++ stl stdmap

9
推荐指数
2
解决办法
1万
查看次数

std :: map标准分配器性能与块分配器

我读过一本关于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)上编译.有人有这种固定大小的块分配器的经验吗?

c++ performance memory-management stdmap allocator

9
推荐指数
1
解决办法
3498
查看次数

使用指针访问std :: map中的值是明智的吗?

将指针从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)

}

c++ pointers stdmap

9
推荐指数
1
解决办法
2720
查看次数

std :: map <int,int>和std :: map <const int,int>之间有区别吗?

据我所知,std :: map中值对中的键在插入后无法更改.这是否意味着使用键模板参数创建一个映射为const无效?

std::map<int, int> map1;
std::map<const int, int> map2;
Run Code Online (Sandbox Code Playgroud)

c++ stl stdmap std

8
推荐指数
1
解决办法
3392
查看次数

Java相当于C++ std :: map?

我正在寻找一个具有C++ std :: map常用实现特性的Java类(据我所知,它是一个自平衡二进制搜索树):

  1. 插入/删除/搜索的O(log n)性能
  2. 每个元素由唯一键和映射值组成
  3. 键遵循严格的弱顺序

我正在寻找开源或设计文档的实现; 我可能最终会支持原始键/值.

这个问题的风格类似于:Java等价于std :: deque,其答案是"来自Java的原始集合的ArrayDeque".

java collections binary-tree stdmap

8
推荐指数
2
解决办法
6773
查看次数

Boost.Bind访问std :: for_each中的std :: map元素

我有一个存储带键的简单结构的地图.该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函数.

谢谢,卡尔

c++ foreach boost bind stdmap

8
推荐指数
2
解决办法
7201
查看次数

在std :: map中使用(数学)向量

相关:我可以用什么std::map键作为键?

我需要创建一个映射,其中空间中的特定键位置映射到对象列表. 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)

c++ math operator-overloading stdmap

8
推荐指数
1
解决办法
1345
查看次数

使用braced-init初始化std :: shared_ptr <std :: map <>>

我有以下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++ stdmap shared-ptr c++11 list-initialization

8
推荐指数
1
解决办法
2038
查看次数

在 C++ 中返回映射的函数

有人可以给出一个在 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)

c++ return function stdmap cpprest-sdk

8
推荐指数
2
解决办法
1万
查看次数