从嵌套在std::映射中的std::列表中删除元素的最佳方式
Best way to remove an element from a std::list nested inside a std::map
正如标题所说,我想知道从满足某些条件(名称和日期(的映射中的列表中删除元素的最有效方法是什么。这是我提供的功能:
void Register::DeleteActivity(const Date &f,const std::string &a) {
auto it = Registro.find(f);
if(it != Registro.end()) {
if(it->second.empty()) {
std::cout <<"Error"<<std::endl;
} else {
for(auto ip = it->second.begin(); ip != it->second.end();) {
if(ip->getName() == a && ip->getStartdate() == f){
ip->printInfo();
it->second.erase(ip);
} else {
ip++;
}
}
}
} else {
std::cout<< "DeleteActivity::day not found"<<std::endl;
}
}
这是完整的课程:
class Register {
private:
map<Date,std::list<Activity>> Registro;
public:
Register(){};
void addActivity(Date &z, Activity &n);
void editActivity(const Date &a, const std::string &c, Date k, const std::string newname);
void DeleteActivity(const Date &f, const std::string &a);
}
有一个错误:您需要ip = it->second.erase(ip);
erase
使迭代器无效,并向下一个元素返回迭代器。
但你可以摆脱循环,让列表来完成任务:
else {
it->second.remove_if([&f, &a](const Activity& act)
{ return act.getName() == a
&& act.getStartdate() == f; });
}
您的代码存在分段错误,因为擦除会使迭代器无效,但会将迭代器返回到下一个元素。应该是:
ip = it->second.erase(ip);
预增量也比后增量更有效率,因为不必存储原始值并复制迭代器:
++ip;
否则,如果没有重复项,我会使用std::set而不是std::list,这也应该更具性能(log而不是线性(。
#include <iostream>
#include <map>
#include <set>
std::map<const int, std::set<int>> map_set({{0, {1, 2, 3, 4}},
{1, {10, 20, 30, 40}},
{2, {100, 200, 300, 400}},
{3, {}}});
void delete_from_map_set(const int map_index, int value) {
const auto & map_it = map_set.find(map_index);
if(map_it != map_set.end()) {
map_it->second.erase(value);
}
}
void print_map_set() {
for(auto & map_it : map_set) {
std::cout << map_it.first << ": [";
for(auto & list_it : map_it.second) {
std::cout << list_it << ", ";
}
std::cout << "]" << std::endl;
}
}
int main(int argc, char * argv[]) {
print_map_set();
delete_from_map_set(0, 1);
print_map_set();
return 0;
}
相关文章:
- 使用std::transform将一个范围的元素添加到另一个范围中
- 有没有办法将谓词中的元素偏移量传递给 std 算法?
- 我想访问std::unique_ptr中的一个特定元素
- 如何从存储在std::映射中的std::集中删除元素
- 缓存std::数组的选定元素,并在c++中自动保持其一致性
- 从嵌套在std::映射中的std::列表中删除元素的最佳方式
- 使用运算符 [] 引用 std::vector 上最后一个元素时出现问题<>
- 对的排序向量 (std::vector<pair<int, int>>) 按对的第一个元素搜索并更新第二个元素值
- 为什么在 std::map 上移动无法将元素从一个映射移动到另一个映射
- 如何为 std::vector 分配内存,然后稍后为某些元素调用构造函数?
- std::矢量保存 只推送最后一个元素
- std::map:当元素不可默认构造时创建/替换元素
- 如何读/写或遍历 std::array 中的特定元素范围?
- C++如何乘以包含 std::variant 元素的向量的迭代器?正在执行迭代器类型的转换?
- 为什么 std::p air 的大小与其元素的大小之和不同?
- 我可以列表初始化 std::vector 并完美转发元素吗?
- 使用 std::min_element、std::max_element 查找矢量中的最小和最大元素
- 是否有一个 std::set 函数来确定不超过数字 x 的最大元素?
- 除了 std::vector 之外,是否有一个 std 容器不会复制和销毁作为类的元素?
- call call cons构件功能的std ::元素的每个元素