C ++从数组列表中删除元素

时间:2014-08-24 09:18:21

标签: c++ arraylist

将来我会使用标准的lib的向量,但是现在我正在尝试创建一些基本的数据结构来更好地学习C ++(我正在从Java迁移)。

除了remove方法之外,我几乎所有工作都有效。我想得到我正在从数组中删除的元素

template <class generic_type> generic_type & ArrayList<generic_type>::remove(const unsigned int index)
{
        check_range_get(index);
        generic_type & temp = data_array[index];
        for(int i=index;i<size()-1;++i)
        {
                data_array[i]=data_array[i+1];
        }
        --number_of_elements;
        return temp;
}

该方法删除了正确的索引,因此如果您有0到4的数字集合。

0, 1, 2, 3, 4

如果我们使用我的remove方法,则使用索引0调用:

1, 2, 3, 4

但是,它没有返回正确的数字。它返回1而不是返回0。我相信这是因为我的方法会覆盖对第一个索引中数字的引用。

要解决此问题,我可以将generic_type & temp更改为generic_type temp,这将返回正确的值,但根据我的理解,这意味着值实际上是重复的副本是制作。对于一个简单的原始类型,这并不是那么糟糕;但是对于在我们的收藏中具有更大N尺寸的更复杂的对象,复制听起来不是最好的事情。

有没有办法解决这个问题? 感谢所有提前。

1 个答案:

答案 0 :(得分:0)

要优化此代码,一种可能的解决方案是使用C ++ 11的移动语义:

#include <utility>

generic_type temp{ std::move(data_array[index]) };

并按价值返回此,而不是参考。

此外,请注意您已经在循环中制作了大量副本。您可以在那里应用相同的技术:

for(int i=index;i<size()-1;++i)
{
        data_array[i] = std::move(data_array[i+1]);
}