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但除了我不明白为什么这两种引用方法不起作用(但是它们的用途vector和string).我知道这些操作符在库中没有超载,但为什么呢?
经过一些网络搜索,我确实想出了如何引用它
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)
标准没有为集合或其迭代器指定那些运算符,因为这些不是访问集合的有效方法.集合具有双向迭代器.这意味着为了移动到迭代序列中的第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[]实施则同样适用.因此,没有一个有效率的人会想要使用这些运算符,因此它们没有实现.
| 归档时间: |
|
| 查看次数: |
4661 次 |
| 最近记录: |