为什么 c++ 向量没有"delete by index"?
Why is there no "delete by index" for c++ vectors?
我知道我需要写:
myvector.erase (myvector.begin()+5)
删除myvector
中的第五个位置。
我的问题是为什么?
在python中,我可以写: del myvector[5]
。
为了提供所有将与通用算法一起使用的STL容器的均匀接口。
C 和Python具有不同的设计理念。对于C ,所有STL容器和通用算法都是通过迭代图案连接的,并且每个容器接口都尽可能通用。
从STL容器中删除项目的常见接口需要是迭代器,因为索引特定于基于索引的数据结构,例如向量。但是关联容器,例如地图,不是基于索引的,因此无法删除索引。
您不能从基于索引的容器中删除索引,并从关联容器中删除键,因为在设计中,不可能编写可以从两种类型的容器中删除的通用算法。
我的问题是为什么?
由于标准库未为std::vector
提供索引i
来删除i
-TH元素的成员函数。迭代器版本更加通用和均匀,其余的接口。
为例,std::find_if
返回迭代器。您通常想删除std::find_if
返回的结果。每次将迭代器转换为索引很不方便。
实施您想要的东西是微不足道的:
template <typename Container>
void erase_nth(Container& c, std::size_t i)
{
c.erase(std::begin(c) + i);
}
用法:
std::vector<int> v{0, 1, 2, 3, 4};
erase_nth(v, 2);
assert(v == std::vector<int>{0, 1, 3, 4});
我的问题是为什么?
因为这是设计std::vector
的接口的方式。
container.erase(iterator)
是一个由 All 标准C 容器(完全支持擦除(支持的成语,它比简单的"擦除元素"。>
我不能为标准委员会讲话,但是我可以认为,由于可以在索引上进行详细使用该更通用的迭代器擦除以删除元素,因此也没有必要为此提供独立的功能。如果您想拥有这样的东西,很容易编写一个 vector_arg.erase(vector_arg.begin() + index_arg)
的函数。
- 运算符C++ "delete []"仅删除 2 个前值
- 使用模板进行堆栈实现; "name followed by :: must be a class or namespace"
- g++用户定义的动态链接库上的全局new和delete运算符
- 为什么"delete"关键字不删除节点?
- "delete"在 C++ 中实际上做了什么?
- 析构函数和'delete'之间的区别
- 如何知道何时调用删除以及何时调用 delete[] C++?
- 在对象指针上调用 Delete 是否会递归删除其动态分配的成员
- 将 std::thread by 值推送到列表中
- 体系结构x86_64的未定义符号:std:terminate(),typeinfo,运算符delete[],运算符new
- 析构函数中的"delete this"
- 为什么数组大小信息可用于"sizeof"运算符和 delete[] 运算符,但在将数组作为参数传递到
- 即使在使用 delete[] 后仍保留的元素
- MATLAB to C++: csvread() not supported by MATLAB Coder
- 如果我在下面的代码片段中添加"delete[] d;",为什么我得到零?
- C++原始指针和"delete"
- 为什么 std::vector 使用 std::分配器而不是运算符 new 和 delete?
- 重载 new 和 delete 会导致 valgrind 错误
- 为什么"delete"操作员给我访问权限冲突
- 为什么 c++ 向量没有"delete by index"?