删除二维向量行中的元素 - 使用迭代器
Deleting element in row of 2D Vector - With Iterators
我有一个 "Entry" 对象的 7x20 二维向量。 Entry 对象有一个 ID。我想遍历我的向量并执行:
if( idToDelete == entry.getID() )
//Delete entry
目前代码如下所示:
for(auto day : entryRegister)
{
for(auto entry : day)
{
if(entryID == entry.getID())
{
//Delete Entry
}
}
}
我不确定如何制定表达式来实际删除项目。我试过 entryRegister[day].erase(entry)
但我得到一个错误,因为没有找到在方括号中使用迭代器的运算符。
我看到了EntryRegister声明的请求。相关资料只是这样声明的:vector< vector<Entry> >
有7列,每列最多20行。
getID returns 一个介于 1 和 70 之间的无符号字符。
这是我传入要删除的 ID 的函数的一部分。然后我遍历寄存器,并删除任何具有该 ID 的条目。
C++ 在向量中没有函数 "delete a value",因为它可以通过两个更基本的步骤完成,通常称为 erase-remove idiom:
- 找到向量中等于该值的所有项,并将它们交换到向量的末尾,使用
std::remove
or remove_if
- 使用
std::vector::erase
调整矢量大小以删除找到的项目
注意 erase
需要一个或两个迭代器。只支持擦除已知位置的项目
for (auto& day : entryRegister) {
auto erase_begin = std::remove_if(
day.begin(),
day.end(),
[=](const Entry& entry) { return entry.EntryID() == entryID; }
);
day.erase(erase_begin, day.end());
}
请注意,我更改了 entryRegister
循环以通过引用获取 day
,因此更改实际上影响了真实的一天而不是副本。
我有一个 "Entry" 对象的 7x20 二维向量。 Entry 对象有一个 ID。我想遍历我的向量并执行:
if( idToDelete == entry.getID() )
//Delete entry
目前代码如下所示:
for(auto day : entryRegister)
{
for(auto entry : day)
{
if(entryID == entry.getID())
{
//Delete Entry
}
}
}
我不确定如何制定表达式来实际删除项目。我试过 entryRegister[day].erase(entry)
但我得到一个错误,因为没有找到在方括号中使用迭代器的运算符。
我看到了EntryRegister声明的请求。相关资料只是这样声明的:vector< vector<Entry> >
有7列,每列最多20行。
getID returns 一个介于 1 和 70 之间的无符号字符。
这是我传入要删除的 ID 的函数的一部分。然后我遍历寄存器,并删除任何具有该 ID 的条目。
C++ 在向量中没有函数 "delete a value",因为它可以通过两个更基本的步骤完成,通常称为 erase-remove idiom:
- 找到向量中等于该值的所有项,并将它们交换到向量的末尾,使用
std::remove
orremove_if
- 使用
std::vector::erase
调整矢量大小以删除找到的项目
注意 erase
需要一个或两个迭代器。只支持擦除已知位置的项目
for (auto& day : entryRegister) {
auto erase_begin = std::remove_if(
day.begin(),
day.end(),
[=](const Entry& entry) { return entry.EntryID() == entryID; }
);
day.erase(erase_begin, day.end());
}
请注意,我更改了 entryRegister
循环以通过引用获取 day
,因此更改实际上影响了真实的一天而不是副本。