C++ 访问元素时具有奇怪行为的无序_映射
我有一张无序的地图,看起来像这样:C++ 访问元素时具有奇怪行为的无序_映射,c++,unordered-map,C++,Unordered Map,我有一张无序的地图,看起来像这样: std::unordered_map<std::string, double> payments = { {"8/18", 0.0}, {"7/18", 771.98}, {"6/18", 0.0}, {"5/18", 771.98}, {"4/18", 771.98}, {"3/18", 771.98}, {"2/18", 0.0}, {"1/
std::unordered_map<std::string, double> payments = { {"8/18", 0.0}, {"7/18", 771.98}, {"6/18", 0.0}, {"5/18", 771.98},
{"4/18", 771.98}, {"3/18", 771.98}, {"2/18", 0.0}, {"1/18", 3859.90},
{"12/17", 771.98}, {"11/17", 0.0}, {"10/17", 1543.96}, {"9/17", 771.98} };
正如你所看到的,我有一个额外的零,顺序是不一样的。如何修复此问题?您使用的是
std::unordered_map
。这意味着元素没有特定的顺序存储。您的代码工作“正确”。如果您希望维护订单,那么您需要一个类似数组的容器,该容器由std::pair
和std::vector
组成。例如:
int main()
{
std::vector<std::pair<std::string, double>> payments = { {"8/18", 0.0}, {"7/18", 771.98}, {"6/18", 0.0}, {"5/18", 771.98},
{"4/18", 771.98}, {"3/18", 771.98}, {"2/18", 0.0}, {"1/18", 3859.90},
{"12/17", 771.98}, {"11/17", 0.0}, {"10/17", 1543.96}, {"9/17", 771.98} };
for (auto it : payments)
{
std::cout << it.second << " ";
}
}
您正在使用一个
std::无序\u映射
。这意味着元素没有特定的顺序存储。您的代码工作“正确”。如果您希望维护订单,那么您需要一个类似数组的容器,该容器由std::pair
和std::vector
组成。例如:
int main()
{
std::vector<std::pair<std::string, double>> payments = { {"8/18", 0.0}, {"7/18", 771.98}, {"6/18", 0.0}, {"5/18", 771.98},
{"4/18", 771.98}, {"3/18", 771.98}, {"2/18", 0.0}, {"1/18", 3859.90},
{"12/17", 771.98}, {"11/17", 0.0}, {"10/17", 1543.96}, {"9/17", 771.98} };
for (auto it : payments)
{
std::cout << it.second << " ";
}
}
std::vector
是几乎所有东西的良好默认设置如果您需要维护创建顺序并通过字符串快速访问,那么boost::multiindex
是一种方法,但不幸的是,它对于初学者来说并不太简单。另一种方法是创建std::unordered_map
,索引指向std::vector
,std::vector
是几乎所有东西的良好默认值。如果您需要维护创建顺序并通过字符串快速访问,那么boost::multiindex
是一种方法,但不幸的是,对于初学者来说,它并不太简单。另一种方法是创建带有std::vector
int main()
{
std::vector<std::pair<std::string, double>> payments = { {"8/18", 0.0}, {"7/18", 771.98}, {"6/18", 0.0}, {"5/18", 771.98},
{"4/18", 771.98}, {"3/18", 771.98}, {"2/18", 0.0}, {"1/18", 3859.90},
{"12/17", 771.98}, {"11/17", 0.0}, {"10/17", 1543.96}, {"9/17", 771.98} };
for (auto it : payments)
{
std::cout << it.second << " ";
}
}
0 771.98 0 771.98 771.98 771.98 0 3859.9 771.98 0 1543.96 771.98