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))