首页 > 解决方案 > 在 C++ 中使用迭代器修改数组元素

问题描述

当我尝试编写一个插入函数时出现问题,该函数假设将数组中的所有元素向上移动到迭代器给定的指定位置,然后在迭代器给定的位置将新值插入数组中。

代码在插入函数中出现错误,并出现以下错误:

'operator[]' 不匹配(操作数类型为 'std::basic_string [1000]' 和 'std::basic_string')

我是使用迭代器的新手,我认为不可能使用指针作为索引来访问数组元素。所以我不确定是否有另一种方法可以做到这一点,或者我是否需要重载 [] 运算符才能使其工作?

template <class T>
class Vector {
    public:
        typedef T* iterator;
        Vector () {  }

        T& operator[](unsigned int i) {
           return items[i];
        }
          // T& operator[](iterator i) {
           //return items[*i];
        //}

        iterator begin () {
            return &items[0];
        }
        iterator end () { 
            return &items[used];
        }
        int size () { return used; }

        iterator insert (iterator position, const T& item) { 

            for(Vector<T>::iterator i=&items[998]; i>=position; i--)
            {
                items[*(i+1)]=items[*i];
            }
            items[*position]= item;

            return position;
        }
    private:
        T items[1000];
        int used=0;
};

标签: c++arraysiterator

解决方案


这段代码是有问题的,因为它创建了 1000 个类型 T 的元素,即使在逻辑上它是空的。此外,如果插入次数超过 1000 次,则丢弃上面的元素。

至于编译问题,我尝试用它编译代码,Vector<int>它编译得很好,但是崩溃了。出于同样的原因,它崩溃了,Vector<int>它不编译Vector<std::string>。问题在于 的类型*i,即std::string的情况Vector<std::string>。要么一直使用迭代器,要么使用索引,但不要混用。使用迭代器:

        for(Vector<T>::iterator i=&items[998]; i>=position; i--)
        {
            *(i+1)=*i;
        }

编辑 :

[刚刚注意到 Scheff 的回答,在完成此编辑后发现了这一点]

上面调用了未定义的行为,v.insert(v.begin(), value)因为因为i在之前迭代items。为了避免这种情况,迭代应该在它脱落之前停止items

        for(Vector<T>::iterator i=&items[999]; i > position; i--)
        {
            *i = *(i-1);
        }

另外,请注意循环后面的行也应该固定:

        items[*position]= item; // <--- BUG: also mixing indexes and iterators


或使用索引:

        for(int i= 998; begin() + i>=position; i--)
        {
            items[i+1]=items[i];
        }

推荐阅读