为什么 c++ 向量没有 "delete by index"?
Why is there no "delete by index" for c++ vectors?
我知道我需要写:
myvector.erase (myvector.begin()+5)
删除myvector
中的第五个位置。
我的问题是为什么?
在python中我可以写:del myvector[5]
.
My question is why?
因为标准库没有为 std::vector
提供成员函数,该成员函数采用索引 i
来删除第 i
个元素。迭代器版本更通用,与界面的其余部分统一。
例如,std::find_if
return 一个迭代器。您经常想擦除 return 由 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});
为了向所有将使用通用算法的 STL 容器提供统一的接口。
C++ 和 Python 有不同的设计理念。在 C++ 的情况下,所有 STL 容器和通用算法都通过迭代器模式连接,并且每个容器接口都尽可能通用。
从 STL 容器中删除项目的通用接口需要是迭代器,因为索引特定于基于索引的数据结构,例如向量。但是关联容器,例如地图,不是基于索引的,因此无法使用索引进行删除。
您不能使用索引从基于索引的容器中删除,也不能使用键从关联容器中删除,因为在该设计中,不可能编写可以从两种类型的容器中删除的通用算法。
My question is why?
因为 std::vector
的界面就是这样设计的。
container.erase(iterator)
是 all 标准 C++ 容器(完全支持擦除)支持的惯用法,它支持的逻辑种类比简单的 "erase element at index".
我不能代表标准委员会发言,但我可以推断,由于这个更通用的迭代器擦除可以简单地用于删除索引处的元素,因此没有必要还专门为此提供一个单独的函数。如果你想要这样的东西,很容易写一个函数来做 vector_arg.erase(vector_arg.begin() + index_arg)
.
我知道我需要写:
myvector.erase (myvector.begin()+5)
删除myvector
中的第五个位置。
我的问题是为什么?
在python中我可以写:del myvector[5]
.
My question is why?
因为标准库没有为 std::vector
提供成员函数,该成员函数采用索引 i
来删除第 i
个元素。迭代器版本更通用,与界面的其余部分统一。
例如,std::find_if
return 一个迭代器。您经常想擦除 return 由 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});
为了向所有将使用通用算法的 STL 容器提供统一的接口。
C++ 和 Python 有不同的设计理念。在 C++ 的情况下,所有 STL 容器和通用算法都通过迭代器模式连接,并且每个容器接口都尽可能通用。
从 STL 容器中删除项目的通用接口需要是迭代器,因为索引特定于基于索引的数据结构,例如向量。但是关联容器,例如地图,不是基于索引的,因此无法使用索引进行删除。
您不能使用索引从基于索引的容器中删除,也不能使用键从关联容器中删除,因为在该设计中,不可能编写可以从两种类型的容器中删除的通用算法。
My question is why?
因为 std::vector
的界面就是这样设计的。
container.erase(iterator)
是 all 标准 C++ 容器(完全支持擦除)支持的惯用法,它支持的逻辑种类比简单的 "erase element at index".
我不能代表标准委员会发言,但我可以推断,由于这个更通用的迭代器擦除可以简单地用于删除索引处的元素,因此没有必要还专门为此提供一个单独的函数。如果你想要这样的东西,很容易写一个函数来做 vector_arg.erase(vector_arg.begin() + index_arg)
.