LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1626|回复: 4

stl的问题求教[c++]

[复制链接]
发表于 2007-7-15 17:57:30 | 显示全部楼层 |阅读模式
  1. #include <iostream>
  2. #include <set>
  3. #include <algorithm>
  4. #include <iterator>
  5.        
  6. using namespace std;
  7. int main() {
  8.         set<int> col1;
  9.         for(int i=0;i<10;i++) {
  10.                 col1.insert(i);
  11.         }
  12.        
  13.        
  14.         transform(col1.begin(),col1.end(),
  15.                 col1.begin(),
  16.                 bind2nd (multiplies<int>(), 2));
  17.         copy(col1.begin(),col1.end(), ostream_iterator<int>(cout," "));
  18.         cout<<endl;
  19. }
复制代码

在visual c++ 2005下面compile通过
cl -nologo -EHsc -GR -Zc:forScope -Zc:wchar_t -Fetransform transform2.cpp

在cygwin下面出错
$ g++ -o transform transform2.cpp
/usr/lib/gcc/i686-pc-cygwin/3.4.4/include/c++/bits/stl_algo.h: In function `_Out
putIterator std::transform(_InputIterator, _InputIterator, _OutputIterator, _Una
ryOperation) [with _InputIterator = std::_Rb_tree_const_iterator<int>, _OutputIt
erator = std::_Rb_tree_const_iterator<int>, _UnaryOperation = std::binder2nd<std
::multiplies<int> >]':
transform2.cpp:18:   instantiated from here
/usr/lib/gcc/i686-pc-cygwin/3.4.4/include/c++/bits/stl_algo.h:789: error: assign
ment of read-only location

mingw下面同样的问题
D:\cpp>g++ -otransform2 transform2.cpp
d:/mingw/bin/../lib/gcc/mingw32/3.4.5/../../../../include/c++/3.4.5/bits/stl_alg
o.h: In function `_OutputIterator std::transform(_InputIterator, _InputIterator,
_OutputIterator, _UnaryOperation) [with _InputIterator = std::_Rb_tree_const_it
erator<int>, _OutputIterator = std::_Rb_tree_const_iterator<int>, _UnaryOperatio
n = std::binder2nd<std::multiplies<int> >]':
transform2.cpp:18:   instantiated from here
d:/mingw/bin/../lib/gcc/mingw32/3.4.5/../../../../include/c++/3.4.5/bits/stl_alg
o.h:789: error: assignment of read-only location

请高人指点一二。不胜感激。
 楼主| 发表于 2007-7-15 21:48:24 | 显示全部楼层
问题已经解决,应该是属于编译器的问题(编译器对于set的读取权限不一致).将set改为vector就可以实现在vc和gcc下都编译通过
  1. #include <iostream>
  2. #include <vector>
  3. #include <algorithm>
  4. #include <iterator>
  5. #include <functional>
  6. using namespace std;
  7. int main() {
  8. vector<int> col1;
  9. for(int i=0;i<10;i++) {
  10. col1.push_back(i);
  11. }
  12. transform(col1.begin(),col1.end(),
  13. col1.begin(),
  14. bind2nd (multiplies<int>(), 2));
  15. copy(col1.begin(),col1.end(), ostream_iterator<int>(cout," "));
  16. cout<<endl;
  17. }
复制代码


同时加上#include <functional> 在sunstudio10上面也编译通过ok!
回复 支持 反对

使用道具 举报

发表于 2007-7-15 22:14:33 | 显示全部楼层
1、代码最好用code标签
2、这关编译器什么事,是stl实现不一样吧
回复 支持 反对

使用道具 举报

发表于 2007-7-16 11:07:31 | 显示全部楼层
的确。 libstdc++ 里 std::set::begin() 返回的 std::set::iterator 是 _Rep_type::const_iterator ,而不是 _Rep_type::iterator 。
libstdc++ 的头文件里有这样的注解:
  1.       // _GLIBCXX_RESOLVE_LIB_DEFECTS
  2.       // DR 103. set::iterator is required to be modifiable,
  3.       // but this allows modification of keys.
复制代码
也就是说,当前 libstdc++ 的实现是为了保证键值不能被修改而作出的牺牲。而标准中说明 std::set::iterator 要求是可以修改的,但这样就会允许修改 set 的键值。当前的提交审议的解决方案是:
  1. Proposed resolution:
  2. Add the following to 23.1.2 [associative.reqmts] at the indicated location:
  3.     At the end of paragraph 3: "For any two keys k1 and k2 in the same container, calling comp(k1, k2) shall always return the same value."
  4.     At the end of paragraph 5: "Keys in an associative container are immutable."
  5.     At the end of paragraph 6: "For associative containers where the value type is the same as the key type, both iterator and const_iterator are constant iterators. It is unspecified whether or not iterator and const_iterator are the same type."
复制代码
最后一段说,当值类型与键类型相同时, set::iterator 和 set::const_iterator 都将是常量迭代器。也就是说,如果该议题通过,楼主第一个 set 的例子将是不成立的。当然这还没有最终定案。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-7-16 13:31:26 | 显示全部楼层
谢谢manphiz的耐心解释,受益非浅.Thank you very much!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表