C++ C++;这是正确的做法吗

C++ C++;这是正确的做法吗,c++,stl,C++,Stl,如果这是错误的网站,请提前道歉,如果是,请让我知道 我编写了一个函数,用于检查某个特定的std::map中是否存在一个键,并想知道这是否是一个好的使用方法,以及是否有人可以提供任何改进建议 std::map允许为值接受多种数据类型 union Variants { int asInt; char* asStr; Variants(int in) { asInt = in; } Variants() { asInt = 0;} Variants(cha

如果这是错误的网站,请提前道歉,如果是,请让我知道

我编写了一个函数,用于检查某个特定的
std::map
中是否存在一个键,并想知道这是否是一个好的使用方法,以及是否有人可以提供任何改进建议

std::map
允许为值接受多种数据类型

union Variants {

    int asInt;
    char* asStr;


    Variants(int in) { asInt = in; }
    Variants() { asInt = 0;}
    Variants(char* in) { asStr = in; }

    operator int() { return asInt; }
    operator char*() { return asStr; }

};

template<typename T, typename Y>
bool in_map(T value, std::map<T, Y> &map)
{
     if(map.find(value) == map.end()) {
       return false;
   }else{
     return true;
   }
}
联合变量{
国际性;
char*asStr;
变量(int in){asInt=in;}
变体(){asInt=0;}
变体(char*in){asStr=in;}
运算符int(){return asInt;}
运算符char*(){return asStr;}
};
模板
bool in_映射(T值,标准::映射和映射)
{
if(map.find(value)=map.end()){
返回false;
}否则{
返回true;
}
}
然后我可以主要使用以下内容:

 std::map<string, Variants> attributes;

 attributes["value1"] = 101;
 attributes["value2"] = "Hello, world";

 if(in_map<std::string, Variants>("value1", attributes))
 {
    std::cout << "Yes, exists!";
 }
std::映射属性;
属性[“值1”]=101;
属性[“value2”]=“你好,世界”;
if(在地图中(“值1”,属性))
{

std::cout我看到的函数的最大问题是,您正在丢弃生成的迭代器

当您检查映射中是否存在一个键时,大多数情况下您都希望在此之后检索/使用关联的值。在这种情况下使用函数会迫使您以性能为代价进行双重查找。我只想完全避免使用函数,直接编写测试,保留迭代器以备以后在中使用为了避免无用的查找:

auto it = map_object.find("key");
if (it != map_object.end())
    use(it->second);
else
    std::cout << "not found" << std::endl;
autoit=map_object.find(“key”);
if(it!=map_object.end())
使用(it->second);
其他的

std::cout我看到的函数的最大问题是,您正在丢弃生成的迭代器

当您检查映射中是否存在一个键时,大多数情况下您都希望在此之后检索/使用关联的值。在这种情况下使用函数会迫使您以性能为代价进行双重查找。我只想完全避免使用函数,直接编写测试,保留迭代器以备以后在中使用为了避免无用的查找:

auto it = map_object.find("key");
if (it != map_object.end())
    use(it->second);
else
    std::cout << "not found" << std::endl;
autoit=map_object.find(“key”);
if(it!=map_object.end())
使用(it->second);
其他的
标准::cout
关于改进的建议

当然

模板
bool in_映射(T值,常量标准::映射和映射)
{
返回map.find(value)!=map.end();
}
我会把map作为第一个参数(只是一个首选项)。另外,因为整个东西都可以放在一行中,所以您甚至可能不需要这个函数

您还丢弃了返回的迭代器,但因为您没有使用它,所以这不是一个问题

除此之外,就编码实践而言,这看起来还可以吗?即使用Union还是有其他类型可以使用,例如struct

嗯,使用
char*
看起来不是个好主意,因为
char*
意味着可以修改数据。
char*
还意味着这个指针是动态分配的,您可能希望
delete[]
稍后再使用该指针。并且不能在联合中使用析构函数。如果无法更改文本,可以使用
const char*
,否则可能需要使用不同的数据类型。另请参阅

下一个问题-您试图将char*和int放在同一位置。这意味着在某个点上您试图将指针转换为整数。这是一个坏主意,因为在64位平台上,指针可能不适合int,而您只能得到它的一半

此外,如果您试图在同一变量中存储多个不同的值,则不会指示存储在任何位置的类型。为此,您需要将union括在结构中并添加字段(到结构中)这表示存储对象的类型。但是,在这种情况下,您将重新发明轮子。因此,如果您试图存储“通用”类型,您可能需要查看或。但所有这些都需要大型外部库(或)

关于改进的建议

当然

模板
bool in_映射(T值,常量标准::映射和映射)
{
返回map.find(value)!=map.end();
}
我会把map作为第一个参数(只是一个首选项)。另外,因为整个东西都可以放在一行中,所以您甚至可能不需要这个函数

您还丢弃了返回的迭代器,但因为您没有使用它,所以这不是一个问题

除此之外,就编码实践而言,这看起来还可以吗?即使用Union还是有其他类型可以使用,例如struct

嗯,使用
char*
看起来不是个好主意,因为
char*
意味着可以修改数据。
char*
还意味着这个指针是动态分配的,您可能希望
delete[]
稍后再使用该指针。并且不能在联合中使用析构函数。如果无法更改文本,可以使用
const char*
,否则可能需要使用不同的数据类型。另请参阅

下一个问题-您试图将char*和int放在同一位置。这意味着在某个点上您试图将指针转换为整数。这是一个坏主意,因为在64位平台上,指针可能不适合int,而您只能得到它的一半

此外,如果您试图在同一变量中存储多个不同的值,则不会指示存储在任何位置的类型。为此,您需要将union括在结构中并添加字段(到结构中)这表示存储对象的类型。但是,在这种情况下,您将重新发明轮子。因此,如果您试图存储“通用”类型,您可能需要查看、或。但所有这些都需要大型外部库(或)。

键入

if(in_map<std::string, Variants>("value1", attributes))
在本例中,我必须构造一个
std::string
对象来替换
char*
,但是我已经从调用中完全删除了模板定义,编译器仍然会计算出
T
Yif(in_map<std::string, Variants>("value1", attributes))
if(in_map(std::string("value1"), attributes))
#define in_map(value,map) (map.find(value) != map.end())
if(in_map("value1", attributes))