最近我写了一篇帖子,在帖子中我请求帮助解决C++代码中的一个问题。然而,有些人关注的是我在其中一个代码中给出的定义,即:
std::map <std::string, std::pair<std::string, std::string>> map_example;
说这被认为是一个糟糕的定义,我应该取代它
我想问你,你是否可以建议我用C++代码表示这个数据结构的更好方法(可能我想避免元组(,谢谢。
编辑
这里是我上面谈到的问题的链接。
针对std::pair
的一个常见问题是其成员的命名不正确。当您可能使用更好的名称时,您的代码将点缀有first
和second
。
比较
struct customer_name_and_company {
std::string customer_name;
std::string company;
};
std::map<std::string, customer_name_and_company> m;
for (const auto& e : m) {
std::cout << e.customer_name << " " << e.company << "n";
}
使用std::pair
:使用相同的代码
std::map<std::string, std::pair<std::string,std::string> m;
for (const auto& e : m) {
std::cout << e.first << " " << e.second << "n";
}
类型和使用该类型的循环都不使用正确的名称。名字很重要!假设您只查看循环,那么customer_name
和company
会立即告诉您这些成员是什么,而first
和second
则要求您跟踪以前的定义,以使代码变得有意义。
当您根本无法给出比first
和second
更好的名称,因为您不知道它们是什么时,std::pair
对于泛型代码来说是很好的。此外,标准库广泛使用std::pair
(例如std::map::insert
和其他(。我想这是为了避免简单类型的膨胀,这会污染std
命名空间。另一方面,在您自己的代码中,任何可以赋予有意义名称的变量和类型都意味着代码可读性更强。
struct customer_name_and_company
{
customer_name_and_company(const std::string& _customer_name, const std::string& _company) :
customer_name{_customer_name},
company{_company} {}
std::string customer_name;
std::string company;
};
int main()
{
std::unordered_map <std::string, customer_name_and_company> umap {{"banana", customer_name_and_company{"1", "2"}}};
}
与上面的实现类似,但我认为std::unordered_map
比std::map
更有效,在没有冲突的情况下(在这种情况下,复杂性将为O(n((,但在其他情况下,与O(logN(相比,所有操作(删除、搜索、插入(的复杂性为O(1(。