从集合向量中删除集

时间:2014-04-18 14:38:58

标签: c++ vector set

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

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

当&#39;找到&#39;找到了,无论如何在向量中返回该集合的位置

例如,如果find = 5,我的vector包含元素:

[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);
  }

3 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:0)

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

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

除非你想一次删除多个套装?这可能会使(只是轻微)更复杂。

答案 2 :(得分:0)

附加说明:您在此行中超出了矢量限制:

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){