从集合向量中移除集合

Posted

技术标签:

【中文标题】从集合向量中移除集合【英文标题】:Removing set from vector of sets 【发布时间】:2014-04-18 14:38:57 【问题描述】:

我有一个充满集合的向量,我正在使用这段代码在向量中查找一个 int:

for(int j = 0; j <= vector.size(); ++j)
  if(vector[j].find(find) != vector[j].end())
   std::cout << "FOUND: " << propagator << "\n";
  

这将在找到'find'时输出,无论如何返回该集合在向量中的位置

例如,如果 find = 5,并且我的向量包含元素:

[0] 2 3 
[1] 4 5

无论如何我可以返回位置 1 的集合,最终我想从数组中删除整个集合

我一直在用

for(int j = 0; j <= vector.size(); ++j)
  if(vector[j].find(find) != vector[j].end())
    vector.erase (vector.begin()+j);
  

【问题讨论】:

您已经拥有该职位 - j 我不明白。你说你有一个集合向量,你在向量中搜索一个 int 。此外,将您的 for 语句切换为 for(size_t j = 0; j &lt;= vector.size(); ++j) 以使警告无效。 你能提供一个用例吗?也许不同的容器会更好地满足您的需求 @MrDuk 用于单元子句算法,取一个CNF格式的文件。所以会有 x 子句(在这个例子中进入向量)和每个元素内的 y 变量 【参考方案1】:

返回位置并不难。例如,您可以使用标准算法std::find_if,然后应用函数std::distance 来确定位置。或者您可以使用循环自己编写函数

std::vector<std::set<int>>::size_type i = 0;

while ( i < v.size() && v[i].find( key ) == v[i].end() ) ++i;

if ( i != v.size() ) v.erase( std::next( v.begin(), i ) ); 

auto it = std::find_if( v.begin(), v.end(),
                        [&]( const std::set<int> &s )
                        [
                           return ( s.find(key ) != s.end() );
                         );

if ( it != v.end() ) v.erase( it );

如果您需要删除向量中包含给定值(键)的所有元素,则可以使用标准算法std::remove_if 以及成员函数erase

【讨论】:

【参考方案2】:

使用已有的,无需循环再搜索:

vector.erase(vector.begin() + j);

除非您想一次删除多个集?这可能会变得(稍微)更复杂。

【讨论】:

是的,一旦包含 (find) 的集合被删除,我将需要删除多个集合。 (find) 将使用新的 int 进行更新,然后需要将其删除 您可能需要小心一点,因为vector::erase 可能会使迭代器和索引无效。【参考方案3】:

附加说明:您在这一行中超出了向量的限制:

for(int j = 0; j <= vector.size(); ++j)

您必须在 j &lt; vector.size() 时进行迭代。尽管您可以使用 int 来完成此操作,但正确执行此操作的类型是 size_t(与 vector&lt;T&gt;::size() 匹配:

for(size_t j = 0; j < vector.size(); ++j)

【讨论】:

以上是关于从集合向量中移除集合的主要内容,如果未能解决你的问题,请参考以下文章

1.22 P235第三题创建Map集合,创建Emp对象,将Emp对象添加到集合中,并将id为005的对象从集合中移除。

如何从文件中填充集合向量的向量?

如何从特征向量或单词生成句子?

r 从多个向量中提取集合。

移除集合元素

Jquery 4种移除 清空元素的方法