如何擦除嵌套在向量中的列表中的元素
How to erase an element that is nested within a list which is nested within a vector
我正在构建一个散列表,使用单独的链接,使用成对列表的向量作为数据结构。我在尝试从嵌套在向量中的列表结构中删除 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);
但我不确定如何导航到列表中的特定位置
感谢您的帮助。
作为免责声明,我昨天在这里与一位用户讨论这个问题,他在这里提出了一个解决方案:http://cpp.sh/96na5 然而,这对我来说似乎有点难以承受,我觉得有一个更简单的解决方案
当您使用 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;
}
}
这可以通过以下方式完成
v[myhash( k )].remove( { k, k } );
我正在构建一个散列表,使用单独的链接,使用成对列表的向量作为数据结构。我在尝试从嵌套在向量中的列表结构中删除 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);
但我不确定如何导航到列表中的特定位置
感谢您的帮助。
作为免责声明,我昨天在这里与一位用户讨论这个问题,他在这里提出了一个解决方案:http://cpp.sh/96na5 然而,这对我来说似乎有点难以承受,我觉得有一个更简单的解决方案
当您使用 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;
}
}
这可以通过以下方式完成
v[myhash( k )].remove( { k, k } );