从集合向量中移除集合
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 <= 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 < vector.size()
时进行迭代。尽管您可以使用 int
来完成此操作,但正确执行此操作的类型是 size_t
(与 vector<T>::size()
匹配:
for(size_t j = 0; j < vector.size(); ++j)
【讨论】:
以上是关于从集合向量中移除集合的主要内容,如果未能解决你的问题,请参考以下文章