RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 907388
Accepted
Adokenai
Adokenai
Asked:2020-11-16 21:22:09 +0000 UTC2020-11-16 21:22:09 +0000 UTC 2020-11-16 21:22:09 +0000 UTC

如何自动分配数组元素?

  • 772

宏从一开始就无法做到这一点。

const collation_t collation_ascii[256]头文件中定义了一个数组。类型

using collation_t = struct _collation {
    wchar_t l; 
    wchar_t u;
};

定义大小写字符的比例。要实际初始化数组元素,请使用模板

template<const size_t normal>
constexpr collation_t COLLATION() {
    return { normal, normal };
}
template<const size_t lower, const size_t upper>
constexpr collation_t COLLATION() {
    return { lower, upper };
}
template<const size_t number, const size_t lower, const size_t upper>
constexpr collation_t COLLATION() {
    return { lower, upper };
}

他工作。但是大多数数组元素都有内容{X, X},也就是唯一的。您需要类似 的东西COLLATION_RANGE(Begin, End),它将用值补充数组COLLATION<Current, Current, Current>,它以从 1到包含Current的步长“运行” 。在 SO 上有一个展开循环的选项(我找不到链接),或者更确切地说重复该函数一定次数(展开),但我无法调整此选项。BeginEnd

也就是说,我想要这个“糖”:

const collation_t collation_ascii[256]={
    COLLATION_RANGE<0, 64>(), 
    COLLATION<'a','A'>(), COLLATION<'b','B'>(), COLLATION<'c','C'>(),
    COLLATION<'d','D'>(), COLLATION<'e','E'>(), COLLATION<'f','F'>(),
    COLLATION<'g','G'>(), COLLATION<'h','H'>(), COLLATION<'i','I'>(),
    COLLATION<'j','J'>(), COLLATION<'k','K'>(), COLLATION<'l','L'>(),
    COLLATION<'m','M'>(), COLLATION<'n','N'>(), COLLATION<'o','O'>(),
    COLLATION<'p','P'>(), COLLATION<'q','Q'>(), COLLATION<'r','R'>(),
    COLLATION<'s','S'>(), COLLATION<'t','T'>(), COLLATION<'u','U'>(),
    COLLATION<'v','V'>(), COLLATION<'w','W'>(), COLLATION<'x','X'>(),
    COLLATION<'y','Y'>(), COLLATION<'z','Z'>(),
    COLLATION_RANGE<91,60>(),
    COLLATION<'a','A'>(), COLLATION<'b','B'>(), COLLATION<'c','C'>(),
    COLLATION<'d','D'>(), COLLATION<'e','E'>(), COLLATION<'f','F'>(),
    COLLATION<'g','G'>(), COLLATION<'h','H'>(), COLLATION<'i','I'>(),
    COLLATION<'j','J'>(), COLLATION<'k','K'>(), COLLATION<'l','L'>(),
    COLLATION<'m','M'>(), COLLATION<'n','N'>(), COLLATION<'o','O'>(),
    COLLATION<'p','P'>(), COLLATION<'q','Q'>(), COLLATION<'r','R'>(),
    COLLATION<'s','S'>(), COLLATION<'t','T'>(), COLLATION<'u','U'>(),
    COLLATION<'v','V'>(), COLLATION<'w','W'>(), COLLATION<'x','X'>(),
    COLLATION<'y','Y'>(), COLLATION<'z','Z'>(),
    COLLATION_RANGE<123,255>()
}

代替

const collation_t collation_ascii[256]={
    COLLATION<0>(), COLLATION<1>(), COLLATION<2>(), COLLATION<3>(),
    COLLATION<4>(), COLLATION<5>(), COLLATION<6>(), COLLATION<7>(),
    COLLATION<8>(), COLLATION<9>(), COLLATION<10>(), COLLATION<11>(),
    COLLATION<12>(), COLLATION<13>(), COLLATION<14>(), COLLATION<15>(),
    COLLATION<16>(), COLLATION<17>(), COLLATION<18>(), COLLATION<19>(),
    COLLATION<20>(), COLLATION<21>(), COLLATION<22>(), COLLATION<23>(),
    COLLATION<24>(),    COLLATION<25>(), COLLATION<26>(), COLLATION<27>(),
    COLLATION<28>(), COLLATION<29>(),   COLLATION<30>(), COLLATION<31>(),
    COLLATION<' '>(), COLLATION<'!'>(), COLLATION<'"'>(),   COLLATION<'#'>(),
    COLLATION<'$'>(), COLLATION<'%'>(), COLLATION<'&'>(), COLLATION<'\''>(),
    COLLATION<'('>(), COLLATION<')'>(), COLLATION<'*'>(), COLLATION<'+'>(),
    COLLATION<','>(),   COLLATION<'-'>(), COLLATION<'.'>(), COLLATION<'/'>(),
    COLLATION<'0'>(), COLLATION<'1'>(), COLLATION<'2'>(), COLLATION<'3'>(),
    COLLATION<'4'>(), COLLATION<'5'>(), COLLATION<'6'>(),   COLLATION<'7'>(),
    COLLATION<'8'>(), COLLATION<'9'>(), COLLATION<':'>(), COLLATION<';'>(),
    COLLATION<'<'>(), COLLATION<'='>(), COLLATION<'>'>(), COLLATION<'?'>(),
    COLLATION<'@'>(),
    COLLATION<'a','A'>(), COLLATION<'b','B'>(), COLLATION<'c','C'>(),
    COLLATION<'d','D'>(), COLLATION<'e','E'>(), COLLATION<'f','F'>(),
    COLLATION<'g','G'>(), COLLATION<'h','H'>(), COLLATION<'i','I'>(),
    COLLATION<'j','J'>(), COLLATION<'k','K'>(), COLLATION<'l','L'>(),
    COLLATION<'m','M'>(), COLLATION<'n','N'>(), COLLATION<'o','O'>(),
    COLLATION<'p','P'>(), COLLATION<'q','Q'>(), COLLATION<'r','R'>(),
    COLLATION<'s','S'>(), COLLATION<'t','T'>(), COLLATION<'u','U'>(),
    COLLATION<'v','V'>(), COLLATION<'w','W'>(), COLLATION<'x','X'>(),
    COLLATION<'y','Y'>(), COLLATION<'z','Z'>(), COLLATION<'['>(),
    COLLATION<'\\'>(), COLLATION<']'>(), COLLATION<'^'>(), COLLATION<'_'>(),
    COLLATION<'`'>(),
    COLLATION<'a','A'>(), COLLATION<'b','B'>(), COLLATION<'c','C'>(),
    COLLATION<'d','D'>(), COLLATION<'e','E'>(), COLLATION<'f','F'>(),
    COLLATION<'g','G'>(), COLLATION<'h','H'>(), COLLATION<'i','I'>(),
    COLLATION<'j','J'>(), COLLATION<'k','K'>(), COLLATION<'l','L'>(),
    COLLATION<'m','M'>(), COLLATION<'n','N'>(), COLLATION<'o','O'>(),
    COLLATION<'p','P'>(), COLLATION<'q','Q'>(), COLLATION<'r','R'>(),
    COLLATION<'s','S'>(), COLLATION<'t','T'>(), COLLATION<'u','U'>(),
    COLLATION<'v','V'>(), COLLATION<'w','W'>(), COLLATION<'x','X'>(),
    COLLATION<'y','Y'>(), COLLATION<'z','Z'>(), COLLATION<'{'>(),
    COLLATION<'|'>(), COLLATION<'}'>(), COLLATION<'~'>(), COLLATION<127>(),
    COLLATION<128>(), COLLATION<129>(),
    COLLATION<130>(), COLLATION<131>(), COLLATION<132>(), COLLATION<133>(),
    COLLATION<134>(), COLLATION<135>(), COLLATION<136>(), COLLATION<137>(),
    COLLATION<138>(), COLLATION<139>(),
    COLLATION<140>(), COLLATION<141>(), COLLATION<142>(), COLLATION<143>(),
    COLLATION<144>(), COLLATION<145>(), COLLATION<146>(), COLLATION<147>(),
    COLLATION<148>(), COLLATION<149>(),
    COLLATION<150>(), COLLATION<151>(), COLLATION<152>(), COLLATION<153>(),
    COLLATION<154>(), COLLATION<155>(), COLLATION<156>(), COLLATION<157>(),
    COLLATION<158>(), COLLATION<159>(),
    COLLATION<160>(), COLLATION<161>(), COLLATION<162>(), COLLATION<163>(),
    COLLATION<164>(), COLLATION<165>(), COLLATION<166>(), COLLATION<167>(),
    COLLATION<168>(), COLLATION<169>(),
    COLLATION<170>(), COLLATION<171>(), COLLATION<172>(), COLLATION<173>(),
    COLLATION<174>(), COLLATION<175>(), COLLATION<176>(), COLLATION<177>(),
    COLLATION<178>(), COLLATION<179>(),
    COLLATION<180>(), COLLATION<181>(), COLLATION<182>(), COLLATION<183>(),
    COLLATION<184>(), COLLATION<185>(), COLLATION<186>(), COLLATION<187>(),
    COLLATION<188>(), COLLATION<189>(),
    COLLATION<190>(), COLLATION<191>(), COLLATION<192>(), COLLATION<193>(),
    COLLATION<194>(), COLLATION<195>(), COLLATION<196>(), COLLATION<197>(),
    COLLATION<198>(), COLLATION<199>(),
    COLLATION<200>(), COLLATION<201>(), COLLATION<202>(), COLLATION<203>(),
    COLLATION<204>(), COLLATION<205>(), COLLATION<206>(), COLLATION<207>(),
    COLLATION<208>(), COLLATION<209>(),
    COLLATION<210>(), COLLATION<211>(), COLLATION<212>(), COLLATION<213>(),
    COLLATION<214>(), COLLATION<215>(), COLLATION<216>(), COLLATION<217>(),
    COLLATION<218>(), COLLATION<219>(),
    COLLATION<220>(), COLLATION<221>(), COLLATION<222>(), COLLATION<223>(),
    COLLATION<224>(), COLLATION<225>(), COLLATION<226>(), COLLATION<227>(),
    COLLATION<228>(), COLLATION<229>(),
    COLLATION<230>(), COLLATION<231>(), COLLATION<232>(), COLLATION<233>(),
    COLLATION<234>(), COLLATION<235>(), COLLATION<236>(), COLLATION<237>(),
    COLLATION<238>(), COLLATION<239>(),
    COLLATION<240>(), COLLATION<241>(), COLLATION<242>(), COLLATION<243>(),
    COLLATION<244>(), COLLATION<245>(), COLLATION<246>(), COLLATION<247>(),
    COLLATION<248>(), COLLATION<249>(),
    COLLATION<250>(), COLLATION<251>(), COLLATION<252>(), COLLATION<253>(),
    COLLATION<254>(), COLLATION<255>()
}

需要注意的是,对于位置 'a' 和 'A' 的数组值是相同的。根据答案,我为自己准备了一个解决方案https://godbolt.org/z/7h2XNi 也许它会对某人有所帮助。

c++
  • 2 2 个回答
  • 10 Views

2 个回答

  • Voted
  1. HolyBlackCat
    2020-11-17T04:15:22Z2020-11-17T04:15:22Z

    出于这些目的,没有必要使用模板。这个问题可以更简单地解决:

    struct collation_t
    {
        wchar_t l; 
        wchar_t u;
    };
    
    constexpr std::array<collation_t, 256> collation_ascii = []{
        std::array<collation_t, 256> ret{};
        for (int i = 0; i < 256; i++)
        {
            char ch = i;
            if (ch >= 'a' && ch <= 'z')
                ret[i] = {ch, ch + 'A' - 'a'};
            else if (ch >= 'A' && ch <= 'Z')
                ret[i] = {ch + 'a' - 'A', ch};
            else
                ret[i] = {ch, ch};
        }
        return ret;
    }();
    
    • 2
  2. Best Answer
    yrHeTateJlb
    2020-11-16T23:26:41Z2020-11-16T23:26:41Z

    两种解决方案的共同部分

    声明和创建Collation保持不变:

    struct Collation{
        wchar_t l; 
        wchar_t u;
    };
    
    template<wchar_t normal>
    constexpr Collation makeCollation(){
        return {normal, normal};
    }
    

    但是要创建一个特定Collation的,我们将使用专业化:

    template<>
    constexpr Collation makeCollation<'a'>(){
        return {'a', 'A'};
    }
    

    为了美观和最小化复制/粘贴错误,您可以将这个东西包装在一个宏中:

    #define COLLATE(lower, upper) \
    template<> \
    constexpr Collation makeCollation<(lower)>(){ \
        return {(lower), (upper)}; \
    }
    
    COLLATE('a', 'A')
    

    使用 STL 的 C++14 解决方案

    现在std::integer_sequence用以下内容填充数组:

    // Эквивалент
    // std::array<Collation, 256> collationArray = {
    //     makeCollation<0>(),
    //     makeCollation<1>(),
    //     makeCollation<2>(),
    //     ...
    //     makeCollation<255>()
    // };
    
    template<std::size_t size, wchar_t... indexes>
    constexpr std::array<Collation, size> createCollatioAarrayImpl(std::integer_sequence<wchar_t, indexes...>){
        return std::array<Collation, size>{ makeCollation<indexes>()... };
    }
    
    template<std::size_t size>
    constexpr std::array<Collation, size> createCollatioAarray(){
        return createCollatioAarrayImpl<size>(std::make_integer_sequence<wchar_t, size>{});
    }
    
    constexpr auto collationArray = createCollatioAarray<256>();
    
    int main(){
        std::wcout << collationArray['a'].u; //A
    }
    

    完整代码:


    没有 STL 的 C++11 中的解决方案

    想法是一样的,只是我们必须实现某种std::aray

    struct CollationArray{
        static constexpr int size = 256;
        Collation array[size];
    };
    

    和std::integer_sequence/std::make_integer_sequence

    template<wchar_t... indexes>
    struct CollationIndexes{};
    
    template<wchar_t size, wchar_t... indexes>
    struct MakeCollationIndexes : MakeCollationIndexes<size - 1, size - 1, indexes...>{};
    
    template<wchar_t... indexes>
    struct MakeCollationIndexes<0, indexes...> : CollationIndexes<indexes...>{};
    

    现在我们用我们的“自行车”填充数组

    template<wchar_t... indexes>
    constexpr CollationArray createCollatioAarrayImpl(CollationIndexes<indexes...>){
        return CollationArray{ makeCollation<indexes>()... };
    }
    
    constexpr CollationArray createCollatioAarray(){
        return createCollatioAarrayImpl(MakeCollationIndexes<CollationArray::size>());
    }
    
    constexpr auto collationArray = createCollatioAarray();
    
    int main(){
        std::wcout << collationArray['a'].u; //A
    }
    

    完整代码

    • 0

相关问题

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    是否可以在 C++ 中继承类 <---> 结构?

    • 2 个回答
  • Marko Smith

    这种神经网络架构适合文本分类吗?

    • 1 个回答
  • Marko Smith

    为什么分配的工作方式不同?

    • 3 个回答
  • Marko Smith

    控制台中的光标坐标

    • 1 个回答
  • Marko Smith

    如何在 C++ 中删除类的实例?

    • 4 个回答
  • Marko Smith

    点是否属于线段的问题

    • 2 个回答
  • Marko Smith

    json结构错误

    • 1 个回答
  • Marko Smith

    ServiceWorker 中的“获取”事件

    • 1 个回答
  • Marko Smith

    c ++控制台应用程序exe文件[重复]

    • 1 个回答
  • Marko Smith

    按多列从sql表中选择

    • 1 个回答
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Suvitruf - Andrei Apanasik 什么是空? 2020-08-21 01:48:09 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5