如何擦除嵌套在向量中嵌套的列表中的元素

时间:2015-11-28 21:26:16

标签: c++ list vector iterator hashtable

我使用单独列表的向量作为数据结构,使用单独的链接构建哈希表。我遇到了一些问题,我试图从嵌套在矢量中的列表结构中删除pair。这是代码http://cpp.sh/8cz4h

的简单代码

这是代码:

// Example program
#include <iostream>
#include <string>
#include <vector>
#include <list>
#include <utility>
using namespace std;

int myhash(const string & k) ;

int main()
{
   vector < list < pair <string, string> > > v;
   v.resize(15);
   string k = "foo";

   //I believe this will take me to the list element I want to iterate over
   for (auto &itr : v[myhash(k)])
   {
     if (itr.first == k)
     {
        //then delete the pair
        v[myhash(k)].erase(itr);
        break;
     }

   }


}

int myhash(const string & k) {
    return k.size() % 15;

}

在擦除功能上有一个错误,说它无法匹配对我有意义的对的列表,我知道v[myhash(k)].erase(itr);没有多大意义,不知道如何解决它。

我认为可以做的事情就像v[myhash(k).at(itr)].erase(itr);,但我不确定如何导航到列表中的某个位置

感谢anyhelp。

作为免责声明,我昨天在这里与一位用户聊聊这个问题,他在这里提出了一个解决方案:http://cpp.sh/96na5然而这对我来说似乎有点压倒性的我觉得有一个更简单的解决方案在那里

2 个答案:

答案 0 :(得分:2)

这可以通过以下方式完成

v[myhash( k )].remove( { k, k } );

答案 1 :(得分:1)

当您使用range-for循环时,您将获得列表中的项目。 std::list没有erase版本接受要从列表中删除的项目。

使用迭代器和普通的range-for循环,而不是使用for循环。

auto& list = v[myhash(k)];
auto iter = list.begin();
auto end = list.end();
for (; iter != end; ++iter )
{
   if (iter->first == k)
   {
      //then delete the pair
      list.erase(iter);
      break;
   }
}