c++ - 在 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;
};
解决方案
这段代码是有问题的,因为它创建了 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];
}
推荐阅读
- apache-spark - 如何判断 spark session 是否能够在数据框中保存数据大小?
- php - 动态输入中的 PHP 数组交换
- javascript - 计算javascript中2个时间戳参数之间的工作日和周末小时数
- c# - 如何在主详细信息页面上使用 PopToRootAsync?
- python - Twitter 数据抓取意外失败 - Python 3.x
- swift - 在 Swift 中,我无法在二进制中创建负数
- node.js - 使用 react-stripe-checkout 进行条带订阅
- javascript - 在特定元素或属性的 HTML 中显示 XML 值
- python-2.7 - 无全局变量传递;退货问题
- go - 如何通过 go generate 传递参数