【问题标题】:C++ Static arrayC++ 静态数组
【发布时间】:2013-12-03 09:50:38
【问题描述】:

我想为 wstrings 创建一个自定义的小写/大写函数。

因此,我使用的是整数映射。

目前我正在从这些地图中自动创建一个函数:

(...)
else if (iCharCode==65)
{
    iRet=97;
}
else if (iCharCode==66)
{
    iRet=98;
}
else if (iCharCode==67)
{
    iRet=99;
}
else if (iCharCode==68)
{
    iRet=100;
}
else if (iCharCode==69)
{
    iRet=101;
}
else if (iCharCode==70)
{
    iRet=102;
}
else if (iCharCode==42818)
{
    iRet=42819;
}
(...)

但是,如果我将我的地图变成这样的 if 语句,函数将会非常大。

因此,我希望使用真实地图,但我不想在运行时加载它。 我更喜欢静态地图,但我不知道该怎么做。

有人可以分享他的想法吗?

【问题讨论】:

  • 这只是巧合。大多数时候不是+32。
  • @Dweeberly 不适用于非 ASCII 字符,因此我正在做自己的功能。
  • @Jimmy 你能删除你的评论吗?你得到了这么多的赞成票,以至于它具有误导性。
  • A std::map<int,int> 会占用太多内存。一种方法是为简单值创建一个数组,例如,为前 256 个值创建一个包含 256 个int 大小写映射值的数组,为其余的值创建一个函数。一般来说,一个函数可以比这里的代码紧凑得多;例如,if(65 <= iCharCode && iCharCode < 71) iRet = iCharCode + 32; else ...

标签: c++ arrays visual-studio-2010 map static


【解决方案1】:

您可以将地图实现为对的排序数组。这可以静态初始化。使用二进制搜索查找值,例如std::lower_bound 使用比较器比较每对的第一个元素。

作为进一步的优化,您可以考虑使用 (range_begin, range_end, offset) 三元组的数组来映射范围而不是单个字符。这会将整个 ASCII 字母表缩减为一个条目;但可能对其他字母不太有效。

【讨论】:

    【解决方案2】:

    也许以下代码可以提供帮助:

    #include<iostream>
    #include<map>
    
    std::map<int, int> code_map = {
      {65, 97},
      {66, 98},
      {67, 99},
      {68, 100},
      {69, 101},
      {70, 102},  
    };
    
    
    int main() {
      for(const auto & pair : code_map) {
        std::cout<<pair.first<<" maps to "<<pair.second<<std::endl;
      }
      return 0;
    }
    

    使用g++ example.cpp -std=c++11 -Wall -Wextra (OS X 10.7.4 GCC 4.8.1) 编译产生:

    $ ./a.out 
    65 maps to 97
    66 maps to 98
    67 maps to 99
    68 maps to 100
    69 maps to 101
    70 maps to 102
    

    【讨论】:

    • 但是我认为每次启动code_map时都会重新创建地图,对吧?
    • code_map 仅在程序启动时构造一次。
    • 我收到错误“使用 {...} 的初始化对于类型 map 无效”。
    • @tmighty:这种初始化方式仅在 C++11 中有效。如果你被困在过去,你需要编写一个函数来初始化它,或者使用类似 Boost.Assignment 的东西。或者,使用pair&lt;int,int&gt; 的排序数组而不是映射,并使用二进制搜索进行查找。这可能更有效,并且可以静态初始化。
    • @MikeSeymour 我现在已经从 VS2010 更新到 VS2012,但是 IDE 告诉我同样的错误。
    猜你喜欢
    • 2010-10-07
    • 1970-01-01
    • 2018-07-29
    • 2015-06-23
    • 2013-07-20
    • 1970-01-01
    • 1970-01-01
    • 2011-02-09
    相关资源
    最近更新 更多