注册 登录
编程论坛 C++教室

map和字符型数组的问题

manesol 发布于 2013-08-10 11:14, 1190 次点击
typedef char sstring[11];
typedef map<sstring,sstring> smap;

如何将字符数组存进map?
13 回复
#2
manesol2013-08-10 11:15
#3
manesol2013-08-10 11:28
sstring key,value;

smap m;

m.insert(make_pair(key,value));

不行啊
#4
manesol2013-08-10 11:35


[ 本帖最后由 manesol 于 2013-8-10 11:37 编辑 ]
#5
manesol2013-08-10 12:07
#6
rjsp2013-08-10 12:12
对于map的key和value,都应当具有拷贝之能力,数组没这个能力
对于map的key,还应该重载operator<,或者在map的第三个模板参数指定一个比较器。

也就是
    sstring a;
    sstring b( a );
    a = b;
    a < b;
得可以编译才行
#7
manesol2013-08-10 12:16
回复 6楼 rjsp
也就是说map不能存字符数组了
#8
manesol2013-08-10 12:21
回复 6楼 rjsp
我要想把字符数组存进map 应该怎样转换呢?
#9
rjsp2013-08-10 12:45
自己写个class封装一下,你先说说你想干什么吧
#10
manesol2013-08-10 13:45
回复 9楼 rjsp
做acm题目,翻译一个句子,要输入大量数据,所以要使用scanf输入,否则超时,所以不能用string类型而要使用字符数组,但是这些单词又要存到map中,所以我想知道字符数组到底怎么存到map中。

链接: http://acm.hdu.
#11
rjsp2013-08-10 15:59
以下是引用manesol在2013-8-10 13:45:25的发言:

做acm题目,翻译一个句子,要输入大量数据,所以要使用scanf输入,否则超时,所以不能用string类型而要使用字符数组,但是这些单词又要存到map中,所以我想知道字符数组到底怎么存到map中。
 
链接: http://acm.hdu.

我随手写了一个,能在VC9.0和g++4.8.1下编译通过,你看着再改改
程序代码:
#include <cstring>
#include <vector>
#include <algorithm>
using namespace std;

struct foo_item
{
    char english[11];
    unsigned long long martian; // 将字符串转换为数值比较的话,速度肯定比strcmp快多了

    foo_item( const char eng[11], const char mar[11] )
    {
        memcpy( english, eng, sizeof(english) );

        martian = 0;
        for( const char* p=mar; *p; ++p )
            martian = martian*26 + (*p-'a');
    }

    bool operator< ( const foo_item& rhs ) const
    {
        return martian < rhs.martian;
    }
};

struct foo
{
    std::vector<foo_item> english_martian;

    foo( size_t reserve_size )
    {
        english_martian.reserve( reserve_size );
    }
    void insert( const char eng[11], const char mar[11] )
    {
        english_martian.push_back( foo_item(eng,mar) );
    }
    void sort()
    {
        std::sort( english_martian.begin(), english_martian.end() );
    }
    const char* find( const char* mar_begin, const char* mar_end ) const
    {
        if( mar_end-mar_begin > 10 )
            return NULL;

        foo_item tmp( "", "" );
        tmp.martian = 0;
        for( const char* p=mar_begin; p!=mar_end; ++p )
            tmp.martian = tmp.martian*26 + (*p-'a');

        std::vector<foo_item>::const_iterator itor = std::lower_bound( english_martian.begin(), english_martian.end(), tmp );
        if( itor==english_martian.end() || tmp<*itor )
            return NULL;

        return itor->english;
    }
};

int main()
{
    // 读入字典表
    foo f( 1000 ); // 1000是瞎猜的,文中没提到字典大约有多少行。设正确了能提高效率,但不设也没关系
    {
        scanf( "%*s" ); // 忽略起始的START
        for( char english[11], martian[11]; scanf("%s%s",english,martian), english[0]!='E'; )
            f.insert( english, martian );
        f.sort();
    }

    // 读取martian文,并翻译
    scanf( "%*c" ); // 忽略
    for( char line[3001]; fgets(line,3000,stdin), strcmp(line,"END\n")!=0; )
    {
        for( const char* p=line; *p; )
        {
            if( *p<'a' || *p>'z' )
            {
                putchar( *p );
                ++p;
                continue;
            }

            const char* p1 = p;
            for( ++p; *p && *p>='a' && *p<='z'; ++p );

            const char* str = f.find( p1, p );
            if( str )
                printf( "%s", str );
            else
                printf( "%.*s", size_t(p-p1), p1 );
        }
    }

    return 0;
}

#12
manesol2013-08-10 16:32
回复 11楼 rjsp
辛苦了,虽然ac不了

[ 本帖最后由 manesol 于 2013-8-10 16:40 编辑 ]
#13
manesol2013-08-10 19:26
回复 11楼 rjsp
vector在查找效率上可以吗?会不会太慢了,map都不行
#14
rjsp2013-08-12 09:03
以下是引用manesol在2013-8-10 16:32:41的发言:

辛苦了,虽然ac不了
我不会AC,我不知道AC的那些道道框框,我检查了一下代码
char line[3001]; fgets(line,3000,stdin),
应该是
char line[3002]; fgets(line,3002,stdin),
其它的错误我也看不出来。

“vector在查找效率上可以吗?会不会太慢了,map都不行 ” --- 这个,我听不懂,也回答不了你。但如果你还想更快,可以分段查询
比如建676个段,第一个段存aa开头的火星文,第二个段存ab开头的火星文,……最后一个段存zz开头的火星文。
1