當試圖寫一個std::unordered_map
的std::string
鍵在下面的例子中,密鑰被寫入以不同的順序不是由初始化列表給出的一個:爲什麼`std :: unordered_map`「像Yoda一樣說話」 - 重新排列元素?
#include <iostream>
#include <unordered_map>
class Data
{
typedef std::unordered_map<std::string, double> MapType;
typedef MapType::const_iterator const_iterator;
MapType map_;
public:
Data(const std::initializer_list<std::string>& i)
{
int counter = 0;
for (const auto& name : i)
{
map_[name] = counter;
}
}
const_iterator begin() const
{
return map_.begin();
}
const_iterator end() const
{
return map_.end();
}
};
std::ostream& operator<<(std::ostream& os, const Data& d)
{
for (const auto& pair : d)
{
os << pair.first << " ";
}
return os;
}
using namespace std;
int main(int argc, const char *argv[])
{
Data d = {"Why", "am", "I", "sorted"};
// The unordered_map speaks like Yoda.
cout << d << endl;
return 0;
}
我期望看到「爲什麼我整理」,但我得到了一個尤達樣輸出:
sorted I am Why
閱讀上unordered_map
here,我看到這一點:
在內部,元素沒有按照任何特定的順序排序,而是組織成桶。一個元素放入哪個桶完全取決於其密鑰的散列。這允許快速訪問單個元素,因爲一旦計算了散列值,它就會指向該元素被放入的確切桶。
這就是爲什麼元素沒有按照初始化列表中相同的方式排序?
當我想以與初始化程序列表相同的方式對鍵進行排序時,我會使用什麼數據結構?我應該在內部保存一個字符串矢量以保存參數順序嗎?可以通過選擇特定的散列函數以某種方式關閉存儲桶組織?
*「什麼數據結構時,我想的鑰匙,在相同的方式初始化列表進行排序我再使用」 *大概一個沒有名字中的「無序」。 ;-) – Kos
嗯,我已經使用'unordered_map',它的散列函數仍然重新排列鍵。 – tmaric
嘗試一個正常的'地圖'。那樣有用嗎? –