C++ 映射和子串

C++ 映射和子串,c++,stl,map,C++,Stl,Map,我想对一个字符串进行排序。 最简单的方法是将所有的满足项放入map中。 为了有效地使用内存,我将后缀传递为(str+I),其中str是char*,I是以开头的位置后缀。然而,我发现map并不会对这些内容进行排序。下面是一个例子 typedef std::map < char*, int,Comparator> MapType; MapType data; // let's declare some initial values to this map char* bob=(char

我想对一个字符串进行排序。 最简单的方法是将所有的满足项放入map中。 为了有效地使用内存,我将后缀传递为(str+I),其中str是char*,I是以开头的位置后缀。然而,我发现map并不会对这些内容进行排序。下面是一个例子

typedef std::map < char*, int,Comparator> MapType;
MapType data;

// let's declare some initial values to this map
char* bob=(char* )"Bobs score";
char* marty=(char* ) "Martys score";
data.insert(pair<char*,int>(marty+1,15));
data.insert(pair<char*,int>(bob+1,10));
MapType::iterator end = data.end();
for (MapType::iterator it = data.begin(); it != end; ++it) {
    std::cout << "Who(key = first): " << it->first;
    std::cout << " Score(value = second): " << it->second << '\n';
}
typedef std::mapMapType;
地图类型数据;
//让我们为这个映射声明一些初始值
char*bob=(char*)“Bobs分数”;
char*marty=(char*)“Martys分数”;
数据插入(成对(marty+1,15));
数据插入(成对(bob+1,10));
MapType::迭代器end=data.end();
对于(MapType::iterator it=data.begin();it!=end;++it){

std::cout映射
将按
字符*
的地址排序,而不是按词法排序。将键更改为
std::string
或定义比较器

编辑:

您似乎试图定义一个
比较器
,但该比较器的定义未发布。以下是一个示例:

#include <iostream>
#include <map>
#include <string.h>

struct cstring_compare
{
    bool operator()(const char* a_1, const char* a_2) const
    {
        return strcmp(a_1, a_2) < 0;
    }
};

typedef std::map<const char*, int, cstring_compare> cstring_map;

int main()
{
    cstring_map m;

    m["bcd"] = 1;
    m["acd"] = 1;
    m["abc"] = 1;

    for (cstring_map::iterator i =  m.begin(); i != m.end(); i++)
    {
        std::cout << i->first << "\n";
    }

    return 0;
}
#包括
#包括
#包括
结构cstring\u比较
{
布尔运算符()(常量字符*a_1,常量字符*a_2)常量
{
返回strcmp(a_1,a_2)<0;
}
};
typedef std::map cstring_map;
int main()
{
cstring_图m;
m[“bcd”]=1;
m[“acd”]=1;
m[“abc”]=1;
for(cstring_map::迭代器i=m.begin();i!=m.end();i++)
{

std::cout首先映射
将按
字符*
的地址排序,而不是按字母顺序。将键更改为
std::string
或定义比较器

编辑:

您似乎试图定义一个
比较器
,但该比较器的定义未发布。以下是一个示例:

#include <iostream>
#include <map>
#include <string.h>

struct cstring_compare
{
    bool operator()(const char* a_1, const char* a_2) const
    {
        return strcmp(a_1, a_2) < 0;
    }
};

typedef std::map<const char*, int, cstring_compare> cstring_map;

int main()
{
    cstring_map m;

    m["bcd"] = 1;
    m["acd"] = 1;
    m["abc"] = 1;

    for (cstring_map::iterator i =  m.begin(); i != m.end(); i++)
    {
        std::cout << i->first << "\n";
    }

    return 0;
}
#包括
#包括
#包括
结构cstring\u比较
{
布尔运算符()(常量字符*a_1,常量字符*a_2)常量
{
返回strcmp(a_1,a_2)<0;
}
};
typedef std::map cstring_map;
int main()
{
cstring_图m;
m[“bcd”]=1;
m[“acd”]=1;
m[“abc”]=1;
for(cstring_map::迭代器i=m.begin();i!=m.end();i++)
{

std::cout首先定义一个自定义比较器,例如

class compare_char { 
   public:
      bool operator()(const char* lhs, const char* rhs) { return strcmp(lhs, rhs); } 
};

使用此比较器而不是当前拥有的任何比较器定义映射。或者,使用具有与值一起工作的比较运算符的键类型的映射,std::string更适合您。当前,您有一个使用char*作为键的映射,用于比较char*类型,即指针的值,而不是内容。

定义自定义比较器,如

class compare_char { 
   public:
      bool operator()(const char* lhs, const char* rhs) { return strcmp(lhs, rhs); } 
};

使用此比较器定义映射,而不是使用您当前拥有的任何映射。或者,使用具有与值一起工作的比较运算符的键类型的映射,std::string更适合您。当前,您有一个使用char*作为键的映射,用于比较char*类型,即指针的值,而不是内容。

您应该d添加您正在使用的比较器类或函数,因为这可能是错误的来源。
strcmp和map comparison函数之间有一点不同

如果a==b,strcmp返回0;如果ab
comp返回true为a 实现比较功能的正确方法如下:

bool operator() (char* lhs, char* rhs) const
{
        return strcmp(lhs,rhs) < 0;
}
bool操作符()(char*lhs,char*rhs)常量
{
返回strcmp(左侧、右侧)<0;
}

您应该添加正在使用的比较器类或函数,因为这可能是错误的来源。
strcmp和map comparison函数之间有一点不同

如果a==b,strcmp返回0;如果ab
comp返回true为a 实现比较功能的正确方法如下:

bool operator() (char* lhs, char* rhs) const
{
        return strcmp(lhs,rhs) < 0;
}
bool操作符()(char*lhs,char*rhs)常量
{
返回strcmp(左侧、右侧)<0;
}

或更改所需的比较器use@ShinTakezou,是的。我想OP可能已经尝试过了。缺少的include cstringstrcmp@ShinTakezou,我只是在添加它!或者更改比较器use@ShinTakezou,是的。我想OP可能已经尝试过了。缺少的include cstringstrcmp@ShinTakezou,我只是补充说t!比较器在哪里定义以及它的作用是什么?当然比较器在映射的定义方面是错误的(
char*
,int)…比较器在哪里定义以及它的作用是什么?当然比较器在映射的定义方面是错误的(
char*
,int)…我怀疑这不可行,因为当lhs大于或小于rhs时,strcmp在两种情况下都返回非零(真);您应该添加
<0
(如hmjd回答中所示)我怀疑这不可行,因为当lhs大于或小于rhs时,strcmp在两种情况下都返回非零(真);您应该添加
<0
(如hmjd的回答)是的,这很有帮助!非常感谢!是的,这很有帮助!非常感谢!