Как использовать стирание карты STL из последнего местоположения при следующем вызове функции? - PullRequest
0 голосов
/ 21 января 2019

У меня есть этот код:

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);
}

Я передаю идентификаторы строк и список для работы. В функции, во-первых, я нахожу эту строку на карте и после того, как обнаружил, что я стираю данные из этой строки, давая ей столбцы, которые находятся в списке. Теперь стереть функцию найти это место и стереть его. Я хочу, чтобы функция стирания запускала поиск индекса из следующего индекса каждый раз после его удаления. Я хочу сделать это для ускорения.

1 Ответ

0 голосов
/ 21 января 2019

Поскольку 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
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...