STL集合/映射w.r.t const char*[英] STL set/map w.r.t const char*

问题描述

你好

我有一个非常基本的问题,但这是一个很好的问题.下面是代码
片段.

结构体ltstr
{
bool operator()(const char* s1, const char* s2) const
{
返回 strcmp(s1, s2) <0;
}
};

int main()
{
常量 int N = 6;
const char* a[N] = {"异构体"、"短暂"、"平淡无奇"、
"nugatory"、"artichoke"、"serif"};
setif (A.find("ephemeral") != A.end())
cout <<"找到了";
其他
cout <<"找不到";
返回0;
}

输出将是-"找到"
我的问题是,为什么?

如何将 const char* 与另一个 const char* 进行比较
找到那个值?我没有指定任何相等运算符?我只是
提到 strcmp(s1, s2) <0
这意味着,当 strcmp(s1, s2) == 0 (在匹配的情况下)
它会返回假.那么 set/map 如何找到 const char*
value?

推荐答案

S S 写道:
你好

我有一个非常基本的问题,但这是一个很好的问题.下面是代码
片段.

结构体ltstr
{
bool operator()(const char* s1, const char* s2) const
{
返回 strcmp(s1, s2) <0;
}
};

int main()
{
常量 int N = 6;
const char* a[N] = {"异构体"、"短暂"、"平淡无奇"、
"nugatory"、"artichoke"、"serif"};
setif (A.find("ephemeral") != A.end())
cout <<"找到了";
其他
cout <<"找不到";
返回0;
}

输出将是-"找到"
我的问题是,为什么?

如何将 const char* 与另一个 const char* 进行比较
找到那个值?我没有指定任何相等运算符?我只是
提到 strcmp(s1, s2) <0
这意味着,当 strcmp(s1, s2) == 0 (在匹配的情况下)
它会返回假.那么 set/map 如何找到 const char*
价值?
我相信这是未定义的行为.你有恒定的"短暂的";在
你的程序两次.一次用于char数组,一次用于
的参数寻找.编译器可能看到它们完全一样,所以改为
制作 2 它只是制作一个并为两者使用相同的指针.

这方面的一个例子是这个程序在我的系统上输出:
00416808 00416808
有一次我运行它

#include <iostream>

int main()
{
const char* foo = "你好";
const char* bar = "你好";

std::cout <<reinterpret_cast<const int*>( foo ) <<""<<
reinterpret_cast<const int*>(bar)<<"\n";
}

编译器不会费心为"Hello"创建两个常量数组,因为
它是不变的,它只创建一次并为两个 foo 使用相同的地址
和酒吧.

--
吉姆·兰斯顿
ta*******@rocketmail.com

吉姆·兰斯顿写道:
S S 写道:
>嗨

我有一个非常基本的问题,但这是一个很好的问题.下面是代码
片段.

struct ltstr
{
bool operator()(const char* s1, const char* s2) const
{
return strcmp(s1, s2)
0;
}
};

int main()
{
const int N = 6;
const char* a[N] = {"isomer", "ephemeral", "prosaic",
"nugatory", "artichoke", "serif"};
set if (A.find("ephemeral") != A.end())
cout <<<"找到";
else
cout
"未找到"
返回0;
}

输出将是-"找到"
我的问题是,为什么?

如何将一个 const char* 与另一个 const char* 进行比较以找到该值?我没有指定任何相等运算符?我刚刚
提到了 strcmp(s1, s2)
0
这意味着,当strcmp(s1, s2) == 0(如果匹配)
它将返回false.那么 set/map 是如何找到 const char*
值的呢?

我相信这是未定义的行为.你有恒定的"短暂的";在
你的程序两次.一次用于char数组,一次用于
的参数寻找.编译器可能看到它们完全一样,所以改为
制作 2 它只是制作一个并为两者使用相同的指针.
没关系,注意
的第二个模板参数的使用std::set.

--
伊恩·柯林斯.

S S 写道:
你好

我有一个非常基本的问题,但这是一个很好的问题.下面是代码
片段.

结构体ltstr
{
bool operator()(const char* s1, const char* s2) const
{
返回 strcmp(s1, s2) <0;
}
};

int main()
{
常量 int N = 6;
const char* a[N] = {"异构体"、"短暂"、"平淡无奇"、
"nugatory"、"artichoke"、"serif"};
setif (A.find("ephemeral") != A.end())
cout <<"找到了";
其他
cout <<"找不到";
返回0;
}

输出将是-"找到"
我的问题是,为什么?

如何将 const char* 与另一个 const char* 进行比较
找到那个值?我没有指定任何相等运算符?我只是
提到 strcmp(s1, s2) <0
这意味着,当 strcmp(s1, s2) == 0 (在匹配的情况下)
它会返回假.那么 set/map 如何找到 const char*
价值?
给定一个有序集合,A <B<C和一个搜索项X,

如果 (X < C) 和 !(B < X) 则 X 等价于 B.

--
伊恩·柯林斯.

本文地址:https://www.itbaoku.cn/post/1050835.html