unordered_map<string, vector<string>> - 当事情 push_back 时内存位置改变
unordered_map<string, vector<string>> - memory location changes when things are push_back
我这里有这段代码。这是 string
到 vector<string>
的奇怪 unordered_map。为什么旧字符串的内存位置随着每个 push_back
到向量而改变?
我在 unordered_map<string, vector<int>>
上尝试了同样的事情,并且整数向量中整数的内存位置 NOT 表现出相同的行为,即每个push_back,较旧的整数没有改变它们的内存位置。我最初虽然这是因为 int 在内存方面比字符串小,但是向后推 50 个 int 仍然不会改变内存位置。为什么会有这样的差异?
这是在 MacOS 上编译的,使用 Clang 版本的 Apple LLVM 版本 7.3.0 (clang-703.0.31)。无论我是否使用 c++11 标志进行编译,都会发生这种情况。
#include <unordered_map>
#include <iostream>
#include <vector>
using namespace std;
int main() {
unordered_map<string, vector<string> > kvStore;
kvStore["a"] = vector<string>();
cout << "kvStore mem location: " << &(kvStore) << endl;
cout << "kvStore[a] mem location: " << &(kvStore["a"]) << endl;
cout << endl;
cout << "--1st push_back--" << endl;
kvStore["a"].push_back("foo");
cout << "kvStore mem location: " << &(kvStore) << endl;
cout << "kvStore[a] mem location: " << &(kvStore["a"]) << endl;
cout << "kvStore[a][0] mem location: " << &(kvStore["a"][0]) << endl;
cout << endl;
cout << "--2nd push_back--" << endl;
kvStore["a"].push_back("bar");
cout << "kvStore mem location: " << &(kvStore) << endl;
cout << "kvStore[a] mem location: " << &(kvStore["a"]) << endl;
cout << "kvStore[a][0] mem location: " << &(kvStore["a"][0]) << endl;
cout << "kvStore[a][1] mem location: " << &(kvStore["a"][1]) << endl;
cout << endl;
cout << "--3rd push_back--" << endl;
kvStore["a"].push_back("foobar");
cout << "kvStore mem location: " << &(kvStore) << endl;
cout << "kvStore[a] mem location: " << &(kvStore["a"]) << endl;
cout << "kvStore[a][0] mem location: " << &(kvStore["a"][0]) << endl;
cout << "kvStore[a][1] mem location: " << &(kvStore["a"][1]) << endl;
return 0;
}
先调用push_back
all iterators and references to vector
's elements are invalidated if the new size()
> capacity()
. To avoid this, call reserve
时。
例如替换
kvStore["a"] = vector<string>();
和
kvStore["a"].reserve(3);
(map
的 operator[]
如果键不存在则创建一个零初始化元素,因此显式赋值是多余的)
并且地址不会改变。 live example
我这里有这段代码。这是 string
到 vector<string>
的奇怪 unordered_map。为什么旧字符串的内存位置随着每个 push_back
到向量而改变?
我在 unordered_map<string, vector<int>>
上尝试了同样的事情,并且整数向量中整数的内存位置 NOT 表现出相同的行为,即每个push_back,较旧的整数没有改变它们的内存位置。我最初虽然这是因为 int 在内存方面比字符串小,但是向后推 50 个 int 仍然不会改变内存位置。为什么会有这样的差异?
这是在 MacOS 上编译的,使用 Clang 版本的 Apple LLVM 版本 7.3.0 (clang-703.0.31)。无论我是否使用 c++11 标志进行编译,都会发生这种情况。
#include <unordered_map>
#include <iostream>
#include <vector>
using namespace std;
int main() {
unordered_map<string, vector<string> > kvStore;
kvStore["a"] = vector<string>();
cout << "kvStore mem location: " << &(kvStore) << endl;
cout << "kvStore[a] mem location: " << &(kvStore["a"]) << endl;
cout << endl;
cout << "--1st push_back--" << endl;
kvStore["a"].push_back("foo");
cout << "kvStore mem location: " << &(kvStore) << endl;
cout << "kvStore[a] mem location: " << &(kvStore["a"]) << endl;
cout << "kvStore[a][0] mem location: " << &(kvStore["a"][0]) << endl;
cout << endl;
cout << "--2nd push_back--" << endl;
kvStore["a"].push_back("bar");
cout << "kvStore mem location: " << &(kvStore) << endl;
cout << "kvStore[a] mem location: " << &(kvStore["a"]) << endl;
cout << "kvStore[a][0] mem location: " << &(kvStore["a"][0]) << endl;
cout << "kvStore[a][1] mem location: " << &(kvStore["a"][1]) << endl;
cout << endl;
cout << "--3rd push_back--" << endl;
kvStore["a"].push_back("foobar");
cout << "kvStore mem location: " << &(kvStore) << endl;
cout << "kvStore[a] mem location: " << &(kvStore["a"]) << endl;
cout << "kvStore[a][0] mem location: " << &(kvStore["a"][0]) << endl;
cout << "kvStore[a][1] mem location: " << &(kvStore["a"][1]) << endl;
return 0;
}
先调用push_back
all iterators and references to vector
's elements are invalidated if the new size()
> capacity()
. To avoid this, call reserve
时。
例如替换
kvStore["a"] = vector<string>();
和
kvStore["a"].reserve(3);
(map
的 operator[]
如果键不存在则创建一个零初始化元素,因此显式赋值是多余的)
并且地址不会改变。 live example