代码之家  ›  专栏  ›  技术社区  ›  asn

无法在STL中打印一组向量的元素

  •  0
  • asn  · 技术社区  · 8 年前

    我是新的STL地图和矢量。我正在尝试打印矢量集中存在的元素。最后一个for循环用于打印元素。代码如下:

    #include<bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    int main(){
        int arr[]={2,0,2,1,4,3,1,0};
    
        vector<int> v;
        set< vector<int> > st;
        //set<int> temp;
        int init=0,fin=0;
        for(int i=0;i<8;++i){
            if(find(v.begin(),v.end(),arr[i])==v.end()){//if(temp.find(arr[i])==temp.end()){
                v.push_back(arr[i]);//temp.insert(arr[i]);
    
            }
            else{
                st.insert(v);
                v.clear();//temp.clear();
                v.push_back(arr[i]);//temp.insert(arr[i]);
            }
    
        }
        set<vector<int> >::iterator itr;
        vector<int>::iterator str;
        for(itr=st.begin();itr!=st.end();++itr){
            for(str=itr->begin();str!=itr->end();++str){
                cout<<*str<<" ";
            }
            cout<<endl;
        }
        return 0;
    
    }
    

    错误是:

    a.cpp:26:11: error: no viable overloaded '='
                            for(str=itr->begin();str!=itr->end();++str){
                                ~~~^~~~~~~~~~~~~
    /Library/Developer/CommandLineTools/usr/include/c++/v1/iterator:1258:7: note: candidate function (the implicit copy assignment operator) not viable: no known conversion from '__wrap_iter<const_pointer>'
          to 'const __wrap_iter<int *>' for 1st argument
    class __wrap_iter
          ^
    a.cpp:34:2: error: unknown type name 'a'
            a.cpp:26:10: error: no viable overloaded '='
            ^
    a.cpp:34:3: error: cannot use dot operator on a type
            a.cpp:26:10: error: no viable overloaded '='
    
    2 回复  |  直到 8 年前
        1
  •  2
  •   acraig5075    8 年前

    你的 str 迭代器需要是常量,因为不可能改变集合的元素。

    vector<int>::const_iterator str;
    

    我不是最大的粉丝 auto 但这是一种情况,如果使用它,就不需要知道迭代器类型是什么。

    for (auto str = itr->begin(); str != itr->end(); ++str)
    
        2
  •  2
  •   zdf    8 年前

    如果编译器是C++ 11兼容的,而不是 set<vector<int> >::iterator itr;... ,试试这个-它更干净:

      for ( const auto& v : st )
        for ( const auto& i : v )
          cout << i << " ";
    

    读 here 关于 auto 和 here 关于愤怒。

    [编辑]

    “那么,这是否使元素在循环中暂时成为常量,而不是稍后?”

    集合元素在任何时候都是常量,否则唯一性将不成立。

    * 集合迭代器的运算符定义为返回 常量引用 到迭代器的当前元素;这就是您不能修改元素的原因。并以此方式进行保护,否则唯一性约束无法保证。

    取集 {1, 2, 3} 想象你在改变 1 到 2 。结果集, {2, 2, 3} 不再是用于 二 不是唯一的。

    相反,如果首先移除元素 {1, 2, 3} - {1} = {2, 3} 然后尝试插入修改后的元素 {2, 3} + {2} ,将以正确的集合结束: {2, 3} 对于 二 未插入,因为它已存在。