【问题标题】:STL iterator won't work? Can't figure out whySTL 迭代器不起作用?不知道为什么
【发布时间】:2011-11-24 04:14:15
【问题描述】:

我有一个有一个私有成员的类:

std::set<unsigned long> Sset;

我对这个函数有问题:

原型:

Set& Union (Set&, Set&);

代码:

    Set& Set::Union (Set& s1, Set& s2)
{
    set<unsigned long>::iterator a;
    set<unsigned long>::iterator j;

    for (a = s1.Sset.begin(); a!=s1.Sset.end(); ++a)
        for (j = s2.Sset.begin(); j!=s2.Sset.end(); ++j)
            if (*a = *j)
            {
                Sset.insert(*a);
                break;
            }

    return *this;
}

我得到编译器错误表达式必须是*a=*j处的可修改左值

迭代器 j 一切正常,但它不会接受 *a

任何帮助或解释? 谢谢

【问题讨论】:

  • 您的命名约定令人困惑。
  • 你试过if((*a) == (*j)) 吗?
  • 我暂时换掉了它,因为我想:也许这会起作用......
  • 这个函数给出的是交集,而不是并集。
  • 您确实知道标准库中有一个std::set_union() 和朋友,对吧?

标签: c++ stl iterator set constants


【解决方案1】:

你应该在 if 语句中使用== 吗?

【讨论】:

  • 是的......我应该。经过 10 多个小时的编码,我看不清楚。谢谢! :)
【解决方案2】:

经典错误 :-) - 比较需要两个等号

if (*a == *j)

【讨论】:

    【解决方案3】:
    if (*a = *j)
    

    是一个任务

    if (*a == *j)
    

    【讨论】:

      【解决方案4】:

      您可以一次性将一组插入另一组:

      std::set<int> s1, s2;
      
      s1.insert(s2.begin(), s2.end());
      

      集合成员是独一无二的,所以没有什么可担心的。

      【讨论】:

      • 很好的建议:)。我的执行时间缩短了大约 12 秒 :)
      • @SeeBeen 那么,你真的想要 set union 吗?您的函数虽然命名为 union,但会计算交集。
      【解决方案5】:

      您不能分配给set::iterator 指向的值。

      为什么?

      因为集合以任何感觉的顺序保持其元素set,具体来说,是排序)以允许快速检索,所以你不能手动告诉它在哪里放置元素。

      相反,insert 元素在正确的位置。

      话虽如此——您的意思是使用== 而不是=

      【讨论】:

      • 我知道我不能分配给那个值,没有看到我错过了=
      【解决方案6】:
      #include ... std::set_union(s1.begin(), s1.end(), s2.begin(), s2.end() ...)

      http://en.cppreference.com/w/cpp/algorithm/set_union

      【讨论】:

        猜你喜欢
        • 2011-05-22
        • 1970-01-01
        • 1970-01-01
        • 2013-05-14
        • 2017-10-30
        • 2020-09-19
        • 2014-01-17
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多