unordered_map <string,vector <string =“”>&gt; - 当事情是push_back时,内存位置会发生变化

时间:2016-10-01 07:46:50

标签: c++ string c++11 vector unordered-map

我这里有这个代码。这是stringvector<string>的奇怪的无序地图。为什么旧字符串的内存位置随着每个push_back的变化而变化?

我在unordered_map<string, vector<int>>上尝试了同样的事情,并且int的向量中的int的内存位置 NOT 表现出相同的行为,即每个push_back,更老的英特尔没有改变他们的记忆位置。我最初虽然这是因为整数小于字符串内存,但推回50个整数仍然不会改变内存位置。为什么会有这样的差异?

这是在MacOS上编译的,其中包含Apple LLVM版本7.3.0的clang版本(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;
}

1 个答案:

答案 0 :(得分:3)

调用push_back时,如果新的vector&gt;所有迭代器和对size()元素的引用都将失效capacity()。为避免这种情况,请先致电reserve

例如,替换

kvStore["a"] = vector<string>();

kvStore["a"].reserve(3);

map的{​​{1}}如果密钥不存在则会创建零初始化元素,因此显式赋值是多余的)

并且地址不会改变。 live example