从集合的向量中删除集合

Removing set from vector of sets

本文关键字:集合 删除 向量      更新时间:2023-10-16

我有一个充满集合的向量,我使用这段代码在向量中寻找一个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);
  }

返回位置并不困难。例如,您可以使用标准算法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

使用您已经拥有的,无需循环并再次搜索:

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

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

额外注意:您正在超出此行中向量的限制:

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

您必须在j < vector.size()时进行迭代。尽管您可以使用int来执行此操作,但要进行此操作的类型是size_t(与vector<T>::size():匹配

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