STL集上的引用运算符[]

2 c++ stl reference set visual-c++

我刚刚熟悉STL,我不太明白为什么operator []会出错.

        int main(){
          set< int > s;
          for(int i=0; i<=1000; i++) s.insert((i*1777)%123);
          for(int i=0; i<s.size(); i++) cout<<s[i]<<endl;
        }
Run Code Online (Sandbox Code Playgroud)

然后我尝试了这个并得到另一个错误消息

        int main(){
          set< int > s;
          for(int i=0; i<=1000; i++) s.insert((i*1777)%123);
          for(int i=0; i<s.size(); i++) cout<<*(s.begin() + i)<<endl;
        }
Run Code Online (Sandbox Code Playgroud)

我理解为什么它没有成员这样push_back,pop_back但除了我不明白为什么这两种引用方法不起作用(但是它们的用途vectorstring).我知道这些操作符在库中没有超载,但为什么呢?

经过一些网络搜索,我确实想出了如何引用它

        int main(){
          set< int > s;
          for(int i=0; i<=1000; i++) s.insert((i*1777)%123);
          for(set< int >::iterator i=s.begin(); i!=s.end(); i++) cout<<*i<<endl;
        }
Run Code Online (Sandbox Code Playgroud)

Ben*_*ley 6

标准没有为集合或其迭代器指定那些运算符,因为这些不是访问集合的有效方法.集合具有双向迭代器.这意味着为了移动到迭代序列中的第n个元素,您需要迭代其间的每个元素.因此,例如,如果要在集合的迭代器中实现operator +,在内部,它将是这样的:

iterator operator+(iterator it, size_t n)
{
    for (int i=0; i<n; ++i)
        ++it;
    return it;
}
Run Code Online (Sandbox Code Playgroud)

换句话说,它将是一个O(n)操作.如果你像在for循环中那样遍历集合,那么它就变成了一个O(n ^ 2)for循环.如果operator[]实施则同样适用.因此,没有一个有效率的人会想要使用这些运算符,因此它们没有实现.

  • @Daniel:你熟悉C++吗?这就是我们在这里谈论的语言.特别是`std :: set`,来自它的标准库,这个库肯定是有序的. (3认同)