【问题标题】:C++ Nested Iterators for Sets [closed]用于集合的 C++ 嵌套迭代器 [关闭]
【发布时间】:2020-10-22 00:31:31
【问题描述】:

我正在尝试对集合使用嵌套迭代器,如下所示,但给出了错误:

错误:“operator+”不匹配(操作数类型为“std::_Rb_tree_const_iterator”和“int”) for(auto itj = iti+1; itj != st.end(); itj++){

int alternate(string s) {
    set<char> st;
    for(char x : s){
        st.insert(x);
    }

    for(auto iti = st.begin(); iti != st.end(); iti++){
        //string t = "";
        for(auto itj = iti+1; itj != st.end(); itj++){
            cout<<*iti<<" "<<*itj<<endl;
        }
    }
}

【问题讨论】:

  • 该代码本身不应导致该错误。但我假设缺少部分?例如,s 是什么?如果auto iti = 0是代码,auto itj = iti+1应该不会造成任何问题(iti和itj推导为int)。
  • 您的代码说iti 是一个整数,但消息说它是一个迭代器。你确定你发布了你正在编译的代码吗?
  • 什么是stst?你这里好像没有用test,为什么要声明呢?
  • 之前的代码是一个更大问题的一部分。为了更好地理解,我重新格式化了代码。我希望你们现在明白了吗? @MikaelH
  • 之前的代码是一个更大问题的一部分。为了更好地理解,我重新格式化了代码。我希望你们现在明白了吗? @molbdnilo

标签: c++ loops iterator set


【解决方案1】:

std::set 的迭代器不满足命名要求 LegacyRandomAccessIterator。只满足LegacyBidirectionalIterator

所以iti + 1 不是一个有效的表达式,迭代器没有匹配的operator+。

要解决您的问题,您可以使用std::next

for (auto iti = st.begin(); iti != st.end(); ++iti){
    for (auto itj = std::next(iti); itj != st.end(); ++itj){
        cout << *iti << " " << *itj << endl;
    }
}

这是demo

【讨论】:

  • std::next()++iti 修改迭代器。 iti+1 不会改变 iti
  • @MikaelH std::next 没有修改它的参数,你可能会想到std::advance
  • @Caleth,这是真的,谢谢。
猜你喜欢
  • 1970-01-01
  • 2016-03-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多