【问题标题】: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 变量

标签: c++ vector set


【解决方案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){
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-07-01
      • 1970-01-01
      • 2012-09-20
      • 2012-02-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多