⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 numbers.cpp

📁 Boost provides free peer-reviewed portable C++ source libraries. We emphasize libraries that work
💻 CPP
字号:
///////////////////////////////////////////////////////////////////////////////// numbers.cpp////  Copyright 2008 David Jenkins. Distributed under the Boost//  Software License, Version 1.0. (See accompanying file//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)#if defined(_MSC_VER)//disbale warning C4996: 'std::xxx' was declared deprecated# pragma warning(disable:4996)#endif#include <iostream>#include <string>#include <map>#include <boost/assign/list_of.hpp> // for 'map_list_of()'#include <boost/xpressive/xpressive.hpp>#include <boost/xpressive/regex_actions.hpp>///////////////////////////////////////////////////////////////////////////////// Match all named numbers in a string and return their integer values//// For example, given the input string://      "one two sixty three thousand ninety five eleven"// the program will output://      "one = 1"//      "two = 2"//      "sixty three thousand ninety five = 63095"//      "eleven = 11"void example1(){    using namespace boost::xpressive;    using namespace boost::assign;    // initialize the maps for named numbers    std::map< std::string, int > ones_map =        map_list_of("one",1)("two",2)("three",3)("four",4)("five",5)        ("six",6)("seven",7)("eight",8)("nine",9);    std::map< std::string, int > teens_map =        map_list_of("ten",10)("eleven",11)("twelve",12)("thirteen",13)        ("fourteen",14)("fifteen",15)("sixteen",16)("seventeen",17)        ("eighteen",18)("nineteen",19);    std::map< std::string, int > tens_map =        map_list_of("twenty",20)("thirty",30)("fourty",40)        ("fifty",50)("sixty",60)("seventy",70)("eighty",80)("ninety",90);    std::map< std::string, int > specials_map =        map_list_of("zero",0)("dozen",12)("score",20);    // n is the integer result    local<long> n(0);    // temp stores intermediate values    local<long> temp(0);    // initialize the regular expressions for named numbers    sregex tens_rx =        // use skip directive to skip whitespace between words        skip(_s)        (            ( a3 = teens_map )            |            ( a2 = tens_map ) >> !( a1 = ones_map )            |            ( a1 = ones_map )        )        [ n += (a3|0) + (a2|0) + (a1|0) ];    sregex hundreds_rx =        skip(_s)        (            tens_rx >>            !(                as_xpr("hundred")  [ n *= 100 ]                >> !tens_rx             )        )        ;    sregex specials_rx =    // regex for special number names like dozen        skip(_s)        (            // Note: this uses two attribues, a1 and a2, and it uses            // a default attribute value of 1 for a1.            ( !( a1 = ones_map ) >> ( a2 = specials_map ) )                [ n = (a1|1) * a2 ]            >> !( "and" >> tens_rx )        )        ;    sregex number_rx =        bow        >>        skip(_s|punct)        (            specials_rx // special numbers            |            (   // normal numbers                !( hundreds_rx >> "million" ) [ temp += n * 1000000, n = 0 ]                >>                !( hundreds_rx >> "thousand" ) [ temp += n * 1000, n = 0 ]                >>                !hundreds_rx            )            [n += temp, temp = 0 ]        );    // this is the input string    std::string str( "one two three eighteen twenty two "        "nine hundred ninety nine twelve "        "eight hundred sixty three thousand ninety five "        "sixty five hundred ten "        "two million eight hundred sixty three thousand ninety five "        "zero sixty five hundred thousand "        "extra stuff "        "two dozen "        "four score and seven");    // the MATCHING results of iterating through the string are:    //      one  = 1    //      two  = 2    //      three  = 3    //      eighteen  = 18    //      twenty two  = 22    //      nine hundred ninety nine  = 999    //      twelve  = 12    //      eight hundred sixty three thousand ninety five  = 863095    //      sixty five hundred ten  = 6510    //      two million eight hundred sixty three thousand ninety five  = 2863095    //      zero = 0    //      sixty five hundred thousand = 6500000    //      two dozen = 24    //      four score and seven = 87    sregex_token_iterator cur( str.begin(), str.end(), number_rx );    sregex_token_iterator end;    for( ; cur != end; ++cur )    {        if ((*cur).length() > 0)            std::cout << *cur << " = " << n.get() << '\n';        n.get() = 0;    }    std::cout << '\n';    // the NON-MATCHING results of iterating through the string are:    //      extra = unmatched    //      stuff = unmatched    sregex_token_iterator cur2( str.begin(), str.end(), number_rx, -1 );    for( ; cur2 != end; ++cur2 )    {        if ((*cur2).length() > 0)            std::cout << *cur2 << " = unmatched" << '\n';    }}///////////////////////////////////////////////////////////////////////////////// mainint main(){    std::cout << "\n\nExample 1:\n\n";    example1();    std::cout << "\n\n" << std::flush;    return 0;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -