std ::与类对象唯一

时间:2016-11-14 16:51:39

标签: c++ stl deque

有一个带有指向类对象指针的双端队列:

deque<myClass*> mydeque;

假设我们在双端队列中有3个对象:obj1, obj2, obj3

基于某些比较逻辑说obj1obj2被认为是相同的元素。

当我们在mydeque上调用std::unique时,它会将deque改为:

obj1 obj3 obj3

这是因为根据std :: unique的文档     通过用下一个不重复的元素替换重复元素来完成删除

std::unique返回最后一个obj3的迭代器。 如果我们想释放obj2占用的内存空间(通过调用delete),我们该如何实现呢?

这里我们不能在返回的迭代器上调用delete,因为它会有效删除obj3。

2 个答案:

答案 0 :(得分:1)

使用C ++ 11功能。使用if(clicked == 1){ var size = dataSize.getElementsByTagName('size')[0]; var title = dataInfo.getElementsByTagName('title')[0]; console.log(title); var width = $(size).attr("width"); var height = $(size).attr("height"); $('#results').append("<img src ="+src+" width="+width+" height="+height+">"+title); 代替原始指针。这样当指向var data = { labels: ['','','','','','','','','',''], datasets: [{ data:[22,25,23,24,25,22,25,23,24,25], backgroundColor: "rgba(54, 255, 170, 0.4)", borderColor: "rgba(54, 255, 170, 1)", orderWidth: 1, }] }; var options = { tooltips: false, legend: { display:false }, scales: { yAxes: [{ display:false, ticks: { beginAtZero:true } }], xAxes: [{ gridLines: { color: "rgba(0, 0, 0, 0)", } }] } }; new Chart($("#chart-"+this.model.id), { type: 'bar', data: data, options: options }); 的指针被覆盖时,其目标将被删除。

如果此std::unique_ptr结构不是obj3个对象的所有者,请改用mydeque

第三个选项是循环遍历排序的双端队列并自行删除重复的值。它必须已经排序,因为myClass仅适用于已排序的时间间隔。

答案 1 :(得分:1)

以下是std::unique的文档说明的内容:

  

通过移动范围中的元素来完成移除,使得要擦除的元素被覆盖。 保留的元素的相对顺序保留,容器的物理大小不变。

     

指向新逻辑端和范围的物理端之间的元素的迭代器仍然是可解除引用的,但元素本身具有未指定的值。

     

调用unique后,通常会调用容器的std::unique方法,这会删除未指定的值并减少物理容器的大小以匹配其新的逻辑大小。

注意2个粗体部分。第一个很重要,它表示保留了相对顺序,即在调用obj1 obj2 obj3 之后,你的双端队列仍将包含

obj3

他们的订单没有改变,为什么?因为非唯一元素已经在最后std::unique,并且因为订单被保留,所以您可以确定它仍然在最后。

您已经知道的第二个粗体部分,但是现在您知道mydeque.erase(std::unique(mydeque.begin(), mydeque.end()), mydeque.end()); 将迭代器返回到最后一个有效元素之后的一个,您可以调用std::deque::erase来擦除每个非唯一元素:< / p>

{{1}}

另请注意,因为存储指针,所以拥有2个相同元素的唯一方法是使2个指针指向同一个地址。