【问题标题】:Set detect insertion failure设置检测插入失败
【发布时间】:2012-03-24 02:00:41
【问题描述】:

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

try
{
   items.insert(item)
}

catch insert_failed_item_already_in_set
{
   // show user the failed item
}

【问题讨论】:

  • 您的 C++ 标准库参考有问题吗?你甚至都不查看你使用的函数的返回类型?
  • 抱歉这个问题。我用的套路不多。我很了解数据结构,只是不知道 C++ 如何检测到插入失败。我不会再在这里问这些问题了。感谢所有花时间回答的人。

标签: c++ set stdset


【解决方案1】:

set::insert 的签名是:

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

因此,您的代码如下所示:

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

【讨论】:

  • 更正; set::insert一个签名
【解决方案2】:

std::set中有这个insert签名

pair&lt;iterator,bool&gt; insert ( const value_type&amp; x );

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

【讨论】:

  • 谢谢!我用的套路不多。我很欣赏参考。这行得通。
【解决方案3】:

作为设置插入返回对,您可以使用布尔值 get 检查对的第二个元素的状态,如果您的插入完成与否。

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

【讨论】:

    【解决方案4】:

    来自cplusplus

    指insert(const T& value)

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

    【讨论】:

      【解决方案5】:

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

      【讨论】:

        【解决方案6】:

        对集合的插入操作返回一对,其成员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";
        
        }
        

        【讨论】:

          【解决方案7】:

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

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

          【讨论】:

            【解决方案8】:

            检查一个项目是否已经在一个集合中很容易。如果这是您要寻找的唯一内容,则无需 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
            }
            

            或者你可以查看insert的返回值,这是一个pair,其中second一半是插入是否成功:

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

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

            【讨论】:

              猜你喜欢
              • 2019-07-29
              • 1970-01-01
              • 1970-01-01
              • 2011-10-24
              • 2019-03-18
              • 2018-08-31
              • 2016-09-17
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多