设置检测插入失败

时间:2012-03-06 15:07:41

标签: c++ set stdset

是否有一种简单的方法可以检测何时未发生插入插入,因为插入的项目已经存在于集合中?例如,我想向用户显示一条消息,显示插入失败,以便他们可以更轻松地查找和删除其数据中的重复项。这里有一些伪代码来演示我想做的事情:

try
{
   items.insert(item)
}

catch insert_failed_item_already_in_set
{
   // show user the failed item
}

8 个答案:

答案 0 :(得分:15)

set::insert的签名是:

pair<iterator,bool> insert ( const value_type& x );

所以,你的代码看起来像是:

if( !items.insert(item).second )
{   
    show user the failed item
}

答案 1 :(得分:9)

insert

中有std::set个签名

pair<iterator,bool> insert ( const value_type& x );

测试返回对的second,如果插入成功则应设置为true。

答案 2 :(得分:4)

来自cplusplus

指的是插入(const T&amp; value)

  

第一个版本返回一对,其成员对:: first设置为一个迭代器,指向新插入的元素或者已经在集合中具有相同值的元素。如果插入了新元素,则对中的pair :: second元素设置为true;如果存在具有相同值的元素,则设置为false。

答案 3 :(得分:4)

作为设置插入返回对,您可以使用get&lt; 1&gt;检查对的第二个元素的状态。如果您的插入已完成,则为布尔值。

if (get<1>(set.insert(x)) == false){
 //Your error log.
}

答案 4 :(得分:2)

STL set<>.insert(elem)返回pair<iterator,bool>,如果元素成功插入,则对中的第二个值为true,否则为false。

答案 5 :(得分:1)

对集合的插入操作返回一对,其成员first设置为指向新插入元素或集合中已有的等效元素的迭代器。如果插入了新元素,则对中的second元素设置为true;如果已存在等效元素,则false设置为second。因此,您可以使用#include <iostream> #include <set> using namespace std; int main () { std::set<int> myset; std::set<int>::iterator it; std::pair<std::set<int>::iterator,bool> ret; for (int i=1; i<=5; ++i) myset.insert(i*10); // set: 10 20 30 40 50 ret = myset.insert(20); // no new element inserted if (ret.second==false) cout<<"Element already present"; } 元素来确定它是否已添加。

例如:

open

答案 6 :(得分:0)

因为set容器不允许重复值,所以插入操作检查插入的每个元素是否已经在具有相同值的容器中存在另一个元素,如果是,则不插入该元素并且 - 如果该函数返回值 - 返回它的迭代器。

你可以在这里找到一个例子: http://www.cplusplus.com/reference/stl/set/insert/

答案 7 :(得分:0)

检查项目是否已在集合中很容易。如果这是您唯一需要的东西,则不需要try / catch。

if ( items.find(item) == items.end() )
{
    // Item was not in the set, so put it in the set
    items.insert(item)
}
else
{
    // Item was already in the set
}

或者您可以检查插入的返回值,该对是second对中的一半是插入是否成功:

if ( false == items.insert(item).second )
{
    // Item was already in the set
}

在这两种方法中,第二种方法更紧凑,效率更高,因为第一种方法需要两次查找,一次在.find期间,另一次在.insert期间。