小编Mar*_*olo的帖子

如何使用存储在c ++中的std向量中的std :: list迭代器制作一个复制安全容器?

对于我的GUI,我需要一个具有以下目的的类来管理控件(窗口,按钮等)

  • 随机访问元素 [index]
  • 随机访问元素 ["key"]
  • 指针稳定性,因此ptr=&container[index]如果添加或删除元素,则不会更改
  • 复制安全.所有元素必须存储在容器中并复制,如果使用'=',则container2=conatiner1(深拷贝)
  • 列表中元素的顺序必须是可更改的,但指向元素的指针必须保持有效.如果ptr1=container[1]ptr2=container[2],则在交换1和2的顺序之后,ptr1==container[2]ptr2==container[1]

我得出结论,std :: list为我需要的指针和std :: vector提供了随机访问的稳定性.所以我有想法在向量中存储std字符串和迭代器的元组.但是,复制容器后迭代器都无效.

关于如何最好地解决这个问题的任何建议?

这里是当前方法的主要代码(仅包括重要部分):

template < class T >
class ControlList 
{
    struct Tuple{std::string first;typename std::list<T>::iterator second;};
    std::vector<Tuple> list;
    std::list<T> objects;

    inline T& operator [](int i)
    {
        return *list[i].second;
    }
    inline T& operator [](std::string s)
    {
        loopi(0,vlist.size()) 
        if(s==vlist[i].first) 
            return *vlist[i].second;
    }
}
Run Code Online (Sandbox Code Playgroud)

字符串访问速度很慢,但通常容器的元素不超过10个,并且在程序中很少使用它.

更新:

共享指针已经很好了,但无法解决我需要的深拷贝.可以说我有window2 = window1.现在,如果我有一个共享指针,那么按下window2中的按钮也会在window1中按下相同的按钮,这是不需要的.我真的需要容器中包含的所有对象的新实例.

是否可以覆盖复制构造函数来创建智能指针引用的对象的新实例?

窗口和按钮都存储在a中ControlList,其中窗口包含多个列表.

UPDATE2:

覆盖复制构造函数和赋值构造函数显然已经解决了这个问题

UPDATE3:

我刚刚发布了这个课程用于麻省理工学院的GUI.

在这里下载.

c++ list vector std deep-copy

5
推荐指数
1
解决办法
603
查看次数

标签 统计

c++ ×1

deep-copy ×1

list ×1

std ×1

vector ×1