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

时间:2018-07-24 11:39:14

标签: c++ vector stl set

我是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 个答案:

答案 0 :(得分:2)

您的str迭代器需要为const,因为不可能对集合的元素进行突变。

vector<int>::const_iterator str;

我不是auto的最大粉丝,但是在这种情况下,如果您使用它,则无需知道迭代器的类型是什么

for (auto str = itr->begin(); str != itr->end(); ++str)

答案 1 :(得分:2)

如果您的编译器是C ++ 11兼容的,而不是set<vector<int> >::iterator itr;...,请尝试以下操作-它更清洁:

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

阅读here关于autohere关于愤怒的信息。

[编辑]

“那么,这是否使元素暂时在循环内而不是以后成为const?”

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

集合迭代器的

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

采用集合{1, 2, 3},并假设您要将1更改为2。结果集{2, 2, 3}不再是2的集合,不再唯一。

相反,如果首先删除元素{1, 2, 3} - {1} = {2, 3},然后尝试插入修改后的元素{2, 3} + {2},则会以正确的集合结尾:{2, 3}代表2未插入,因为它已经存在。