什么是更好的数据结构来取代集合映射



最近我写了一篇帖子,在帖子中我请求帮助解决C++代码中的一个问题。然而,有些人关注的是我在其中一个代码中给出的定义,即:

std::map <std::string, std::pair<std::string, std::string>> map_example;

说这被认为是一个糟糕的定义,我应该取代它

我想问你,你是否可以建议我用C++代码表示这个数据结构的更好方法(可能我想避免元组(,谢谢。

编辑

这里是我上面谈到的问题的链接。

针对std::pair的一个常见问题是其成员的命名不正确。当您可能使用更好的名称时,您的代码将点缀有firstsecond

比较

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_namecompany会立即告诉您这些成员是什么,而firstsecond则要求您跟踪以前的定义,以使代码变得有意义。

当您根本无法给出比firstsecond更好的名称,因为您不知道它们是什么时,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_mapstd::map更有效,在没有冲突的情况下(在这种情况下,复杂性将为O(n((,但在其他情况下,与O(logN(相比,所有操作(删除、搜索、插入(的复杂性为O(1(。

最新更新