gpt4 book ai didi

c++ - 如何在下一个函数调用中从最后一个位置使用 STL 映射删除?

转载 作者:行者123 更新时间:2023-11-30 03:18:52 24 4
gpt4 key购买 nike

我有这个代码:

bool Sparse_Matrix_RL::removeColsFromRow(unsigned int row_id, std::list<unsigned int>& col_ids)
{
std::list<unsigned int>::iterator c_str,s_str;
std::list<unsigned int>::iterator c_end = col_ids.end();
std::map<unsigned int, std::map<unsigned int, double> >::iterator m_str;
if (data_Matrix.count(row_id))
{
m_str = data_Matrix.find(row_id);
}
else
{
std::cout << "Row not found";
return false;
}
std::map<unsigned int, std::map<unsigned int, double> >::iterator m_end = data_Matrix.end();
std::map<unsigned int, std::map<unsigned int, double> >::iterator row;
if (m_str != m_end)
{
for (c_str = col_ids.begin(); c_str != c_end; c_str++)//col_id's are sorted
{
m_str->second.erase(*c_str);
}
}
if (data_Matrix[row_id].size() == 0)
data_Matrix[row_id][row_id] = 0;
return true;
}

下面是我的函数调用:

list<unsigned int>::iterator direc_Str = direc_dofs_list.begin();
list<unsigned int>::iterator direc_End = direc_dofs_list.end();
list<unsigned int>::iterator p;
for (int rid = 0; rid < total_rows; rid++)
{
p = std::find(direc_Str, direc_End, rid);
if (p == direc_End)
stiffness_matrix->removeColsFromRow(rid, direc_dofs_list);
}

我将行 ID 和列表传递给函数。在功能上,首先我在 map 中找到该行,然后发现我正在从该行中删除数据,同时为其提供列表中的列。现在删除功能找到该位置并将其删除。我希望删除功能在每次删除一个索引后从下一个索引开始查找索引。我想这样做是为了加快速度。

最佳答案

由于 col_ids 已排序,您可以利用该顺序并简单地遍历列表并将映射放在一起,就像在合并排序的合并步骤中一样,并挑选出匹配的索引。

auto mm_itr = m_str->second.begin(), mm_end = m_str->second.end();
while(c_str != c_end && mm_itr != mm_end) {
if(*c_str < mm_itr->first) // c_str smaller, progress it
++c_str;
else if(*c_str > mm_itr->first) // key is smaller, progress it
++mm_itr;
else {
mm_itr = m_str->second.erase(mm_itr); // They are equal, erase and grab the returned iterator
++c_str; // Can also progress in the list now
}
}

关于c++ - 如何在下一个函数调用中从最后一个位置使用 STL 映射删除?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54284716/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com