Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/154.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如果有插入/删除/重新灰化操作,无序映射是否复制/释放包含的对象?_C++_Boost_Stl - Fatal编程技术网

C++ 如果有插入/删除/重新灰化操作,无序映射是否复制/释放包含的对象?

C++ 如果有插入/删除/重新灰化操作,无序映射是否复制/释放包含的对象?,c++,boost,stl,C++,Boost,Stl,我想将小对象存储在无序映射中,只是想知道如果有任何插入/删除/重新灰化操作,它是否可以复制/释放包含的对象?我认为无序映射使用链接列表来存储键/值对,它不需要复制/释放像vector这样的对象来重新分配内存。C++11标准:§23.2.5/8 无序关联容器的元素被组织到桶中。具有相同哈希代码的键出现在同一个bucket中。当元素添加到无序关联容器时,存储桶的数量会自动增加,因此每个存储桶的平均元素数量会保持在一个界限以下重新分级会使迭代器、元素之间的顺序更改以及元素出现在其中的bucket更改无

我想将小对象存储在无序映射中,只是想知道如果有任何插入/删除/重新灰化操作,它是否可以复制/释放包含的对象?我认为无序映射使用链接列表来存储键/值对,它不需要复制/释放像vector这样的对象来重新分配内存。

C++11标准:§23.2.5/8

无序关联容器的元素被组织到桶中。具有相同哈希代码的键出现在同一个bucket中。当元素添加到无序关联容器时,存储桶的数量会自动增加,因此每个存储桶的平均元素数量会保持在一个界限以下重新分级会使迭代器、元素之间的顺序更改以及元素出现在其中的bucket更改无效,但不会使元素的指针或引用无效。对于无序的_多重集和无序的_多重映射,重灰化保留等价元素的相对顺序。

简而言之,是无序地图的缩写,
如果执行插入/擦除操作

  • 所有迭代器在重新灰化时都将失效,但引用不会受到影响

我使用以下代码进行了测试:

#include <iostream>
#include <unordered_set>
#include <unordered_map>

struct A
{
    static int copies;

    A(int a): a(a){}
    A(A const& pA){std::cout << "A copy" << std::endl; ++copies; a = pA.a;}
    A& operator=(A const& pA){std::cout << "= operator" << std::endl; a = pA.a; ++copies; return *this;}

    int a;



    bool operator==(A const& pA)const{return pA.a == a;}
    bool operator!=(A const& pA)const{return pA.a != a;}
    bool operator>(A const& pA)const{return pA.a > a;}
    bool operator<(A const& pA)const{return pA.a < a;}
};
int A::copies = 0;


namespace std{
template<>
class hash<A>
{
public:
    size_t operator()(A const& pA) const
    {
        return pA.a;
    }
};
}


int main()
{

    std::unordered_map<A, A> map;
    std::unordered_set<A> set;

    for(int i=0; i<1000000; ++i)
    {
        set.insert(A(i));
        map.insert(std::pair<A, A>(A(i), A(i)));
    }
    std::cout << A::copies << std::endl;

    return 0;
}
#包括
#包括
#包括
结构A
{
静态整型拷贝;
A(inta):A(A){}
A(A const&pA){std::cout