用c++写代码:顺序表中删除下标为i的元素和删除第i个的元素区别
时间: 2024-09-22 14:00:41 浏览: 35
在C++中,顺序表(如数组或动态数组)的操作会有两个常见的删除操作:直接删除指定索引的元素和删除第i个元素。两者的区别在于处理方式:
1. **直接删除指定索引的元素**:
```cpp
void deleteByIndex(SequenceList& list, int i) {
if (i < 0 || i >= list.size()) {
// 处理越界错误
return;
}
// 将最后一个元素移动到已删除位置
for (int j = i; j < list.size() - 1; ++j)
list[j] = list[j + 1];
// 减小列表长度并返回
list.resize(list.size() - 1);
}
```
这里假设`list`是一个动态大小的容器,并且它有一个`resize()`函数用于调整容量。
2. **删除第i个元素**:
这种情况下,我们通常需要先找到第i个元素的位置,然后删除。如果元素有序,可以简单遍历;无序则可能需要额外的数据结构辅助查找,比如二分查找。
```cpp
// 假设已经有一个find函数找到元素的起始索引
size_t findElementIndex(const SequenceList& list, int i) {
// 找到第i个元素的开始位置
size_t pos = std::lower_bound(list.begin(), list.end(), i) - list.begin();
if (pos != i && pos < list.size()) {
// 如果不是第i个元素,返回其起始位置
return pos;
} else {
// 或者元素不存在
return list.size();
}
}
void deleteNthElement(SequenceList& list, int i) {
size_t index = findElementIndex(list, i);
if (index != list.size())
deleteByIndex(list, index);
}
```
这两个操作的主要差异在于是否需要遍历整个列表来定位目标元素。删除下标固定的元素效率更高,而删除第i个元素需要先定位。在实际应用中,要考虑性能和数据结构的特点。
阅读全文