9

我对使用有一些疑问std::map

  1. 使用 a作为良好实践enum的关键吗?std::map考虑以下代码:

    enum Shape{
        Circle,
        Rectangle
    };
    
    int main(int argc, char* argv[])
    {
         std::map<Shape,std::string> strMap;
         // strMap.insert(Shape::Circle,"Circle"); // This will not compile
         strMap[Shape::Circle] = "Circle";         // But this will work
         return 0;
    }
    
  2. 在上面的示例中,为什么insert()在重载运算符正常工作时调用生成编译器错误[]?推荐使用以下哪种方法将项目插入到 中std::map

  3. 我知道在类find()上使用该方法时std::map,它不是在容器中进行顺序搜索,而是进行一些对数搜索,这将比顺序搜索快得多。这种理解正确吗?

4

5 回答 5

12
  1. 将枚举作为 key_type 本身并不坏。(编辑)但是,如果您只使用顺序枚举值,std::vector则具有 O(1) 访问权限的 a 会更好。
  2. insert必须像这样使用:mapVar.insert(make_pair(key, value)); 另见cppreference.com
  3. 是的,std::map按照标准的保证,有 O(log(n)) 查找,如果 n 足够高,这比 O(n) 快。
于 2009-01-28T18:30:16.900 回答
5

插入失败,因为 value_type 是 std::pair

于 2009-01-28T18:34:51.960 回答
3

1)在 std::map 中保持枚举作为键是一种好习惯吗?

好吧,为了提高效率,使用这么小的枚举,最好使用向量或 tr1::array 值(如果您的值类型支持“空”值)或智能指针。前任: vector<string>

为了正确-我相信你很好。Map 可以使用任何可排序的键类型——即具有 operator< 或您为其提供排序功能的键类型。枚举默认有排序

2)strMap.insert(Shape::Circle,"Circle")为什么插入方法[给出]编译器错误?

因为 insert 不接受两个值。它需要一对。尝试:

#include <utility>
...
strMap.insert(make_pair(Circle, string("Circle")));

3)当在地图类中使用 find() 方法时,[它]正在做一些对数搜索......对吗?

是的。map::find 是 O(lg(map::size())) 时间。map 将其键值对存储在按键排序的数据结构中。插入和擦除是 O(lg(n)),就像 find 一样。它还提供双向迭代器,这意味着您可以在 O(1) 恒定时间内找到映射中的下一项或上一项,但一次不能向前和向后跳过多个元素。

编辑:更正了枚举默认排序。

于 2009-01-28T18:34:07.483 回答
1

尝试使用

strMap.insert(std::pair<Shape, std::string>(Circle,"Circle"));

而是(不是 Shape::Circle!)。

枚举值在与 C++ 中的枚举相同的范围内可见(非常丑陋,我绝对不喜欢它,但就是这样!)

于 2009-01-28T18:34:24.287 回答
0

对于这种情况,您通常只需要枚举到字符串的静态映射,执行以下操作通常更容易:

enum Shape{
    Circle,
    Rectangle,
    NShapes,
};

char *ShapeNames[] = 
{  
    "Circle",
    "Rectangle",    
};

void CheckShapeNames()
{
    // Use a static_assert here instead if you have it in your library
    int ShapeNamesCount[(sizeof(ShapeNames)/sizeof(char*)) == NShapes];
}

从那时起,访问形状名称只需访问 ShapeNames 数组即可:

string name = ShapeNames[Shape::Circle];

甚至:

for (int i=0; i < Shape::NShapes; ++i)
{
    cout << ShapeNames[i];
}
于 2009-02-02T18:47:48.307 回答