免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 5643 | 回复: 5
打印 上一主题 下一主题

标准模板库 中 set 使用问题? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2005-10-03 12:37 |只看该作者 |倒序浏览
在使用set 容器保存数据, 出现的问题,
set容器的使用有什么要求呢?

我自定义了一个类 MatrixNode 并实现其中的比较操作, 但使用set插入数据时报错
提示好像是set中的二叉树中比较操作的问题,


以下是代码。


MatrixNode.h


  1. // 该类以一维vector数组保存矩阵。并实现比较操作以及copy构造函数
  2. #ifndef MATRIXNODE_H
  3. #define MATRIXNODE_H
  4. #include <vector>;


  5. class MatrixNode  
  6. {
  7. public:

  8.                //根据行数,列数初始化数据,
  9.         MatrixNode( unsigned short x, unsigned short y );
  10.         MatrixNode();

  11.         ~MatrixNode();
  12.         // 赋值构造函数
  13.         MatrixNode& operator=(MatrixNode &matrix);
  14.                
  15.         bool operator==(const MatrixNode &matrix);
  16.        
  17.                // 比较函数
  18.         bool operator<(const MatrixNode &cmpmatrix);

  19.         MatrixNode(const MatrixNode& tmpmatrix);

  20. public:
  21.        
  22.         unsigned short m_y;
  23.         unsigned short m_x;
  24.         std::vector<unsigned short>; m_vmatrix; // 保存数据的数组.
  25. };

  26. #endif
复制代码


MatrixNode.cpp



  1. // MatrixNode.cpp


  2. #include "MatrixNode.h"
  3. #include <stdlib.h>;
  4. #include <ostream>;


  5. MatrixNode::MatrixNode()
  6. {
  7.         m_x = 0;
  8.         m_y = 0;
  9.         m_vmatrix.reserve(0);

  10. }

  11. MatrixNode::~MatrixNode()
  12. {

  13. }

  14. MatrixNode::MatrixNode(unsigned short x, unsigned short y)
  15. {
  16.         int vectorsize = 0;

  17.         m_x = x;
  18.         m_y        = y;
  19.         vectorsize = x*y;

  20.         m_vmatrix.reserve( vectorsize );

  21.         // 矩阵所有元素清零
  22.         for ( int i = 0; i < vectorsize; i++)
  23.         {
  24.                 m_vmatrix[i] = 0;
  25.         }

  26. }



  27. MatrixNode& MatrixNode::operator=(MatrixNode &matrix)
  28. {
  29.         if (this == &matrix)
  30.                 return *this;

  31.         m_x = matrix.m_x;
  32.         m_y = matrix.m_y;
  33.         int size = 0;
  34.         size = m_x*m_y;

  35.         m_vmatrix.reserve(size);
  36.         for ( int i = 0 ; i < size; i++ )
  37.         {
  38.               m_vmatrix[i] = (matrix.m_vmatrix)[i];
  39.         }

  40.         return *this;

  41. }

  42. MatrixNode::MatrixNode(const MatrixNode& tmpmatrix)
  43. {
  44.         m_x = tmpmatrix.m_x;
  45.         m_y = tmpmatrix.m_y;
  46.         int size = m_x*m_y;
  47.         m_vmatrix.reserve(size);
  48.         for ( int i = 0 ; i < size; i++ )
  49.         {
  50.                 m_vmatrix[i] = (tmpmatrix.m_vmatrix)[i];
  51.         }       

  52. }

  53. bool MatrixNode::operator<(const MatrixNode &cmpmatrix)
  54. {
  55.         int size = 0;
  56.         size = m_x*m_y;

  57.         for ( int i = 0; i < size; i++)
  58.         {
  59.                 if ( m_vmatrix[i] < (cmpmatrix.m_vmatrix)[i] )
  60.                         return true;
  61.         }

  62.         return false;

  63. }

  64. bool MatrixNode::operator==(const MatrixNode &cmpmatrix)
  65. {
  66.         int size = 0;
  67.         size = m_x*m_y;

  68.         for ( int i = 0; i < size; i++)
  69.         {
  70.                 if ( m_vmatrix[i] != (cmpmatrix.m_vmatrix)[i] )
  71.                         return false;
  72.         }

  73.         return true;
  74. }

复制代码



main.cpp


  1. #include <iostream>;
  2. #include <stdlib.h>;
  3. #include "matrixnode.h"
  4. #include <set>;
  5. using namespace std;

  6. int main(int argc, char *argv[])
  7. {
  8.   set<MatrixNode>; a;
  9.   MatrixNode b(3,3);
  10.   a.insert(b);  // 插入数据   

  11.   return 0;
  12. }
复制代码



以前没使用过set容器,
请教以下这该如何解决?


报错显示
   1042 D:\Program Files\Dev-Cpp\include\c++\3.3.
\bits\stl_tree.h   instantiated from `std::pair<std::_Rb_tree_iterator<_Val, _Val&, _Val*>;, bool>; std::_Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>;::insert_unique(const _Val& [with _Key = MatrixNode, _Val = MatrixNode, _KeyOfValue = std::_Identity<MatrixNode>;, _Compare = std::less<MatrixNode>;, _Alloc = std::allocator<MatrixNode>;]'

论坛徽章:
0
2 [报告]
发表于 2005-10-03 18:53 |只看该作者

标准模板库 中 set 使用问题?

错误的原因就是在operator< 、和operator==里没使用const关键字,
这两个函数从语义上来讲,都是属于非修改性的,所以都要加const .

等你什么时候忘记使用数组的下标运算符,你就算入门了.


  1. // 该类以一维vector数组保存矩阵。并实现比较操作以及copy构造函数
  2. #ifndef MATRIXNODE_H
  3. #define MATRIXNODE_H
  4. #include <vector>;


  5. class MatrixNode   
  6. {
  7. public:

  8.               //根据行数,列数初始化数据,
  9.     //两个合成一个,用默认参数就可以了
  10.    MatrixNode( unsigned short x = 0, unsigned short y = 0);
  11. /*   MatrixNode(); */

  12.    ~MatrixNode();
  13.    // 赋值构造函数
  14.    //运算符重载就是运算符重载,构造函数就是构造函数
  15.    //把"构造是一个从无到有的过程,赋值是一个吐故纳新的过程"这句话多读几遍
  16.    MatrixNode& operator=(const MatrixNode &matrix);
  17.               
  18.    bool operator==(const MatrixNode &matrix) const; //如果操作具备常型意义的话,要加const
  19.    
  20.               // 比较函数
  21.    bool operator<(const MatrixNode &cmpmatrix) const;

  22.    MatrixNode(const MatrixNode& tmpmatrix);

  23. public:
  24.   
  25.          unsigned short m_x;   
  26.    unsigned short m_y;
  27.   
  28.    std::vector<unsigned short>; m_vmatrix; // 保存数据的数组.
  29. };

  30. #endif

  31. // MatrixNode.cpp


  32. #include "MatrixNode.h"
  33. #include <stdlib.h>;
  34. #include <ostream>;

  35. /*
  36. MatrixNode::MatrixNode()
  37. {
  38.    m_x = 0;
  39.    m_y = 0;
  40.    m_vmatrix.reserve(0);

  41. }
  42. */
  43. MatrixNode::~MatrixNode()
  44. {

  45. }

  46. //使用缺省参数就可以了
  47. MatrixNode::MatrixNode(unsigned short x, unsigned short y)
  48.         : m_x(x), m_y(y), m_vmatrix(x * y, 0)
  49. {
  50. /*       
  51.    int vectorsize = 0;

  52.    m_x = x;
  53.    m_y   = y;
  54.    vectorsize = x*y;

  55.    m_vmatrix.reserve( vectorsize );

  56.    // 矩阵所有元素清零
  57.    for ( int i = 0; i < vectorsize; i++)
  58.    {
  59.       m_vmatrix[i] = 0;
  60.    }
  61. */
  62. }



  63. MatrixNode& MatrixNode::operator=(const MatrixNode &matrix) //不打算修改传入参数的话,const
  64. {
  65.    if (this == &matrix)
  66.       return *this;

  67.    m_x = matrix.m_x;
  68.    m_y = matrix.m_y;
  69.    
  70.    /*
  71.    int size = 0;
  72.    size = m_x*m_y;

  73.    m_vmatrix.reserve(size);
  74.    for ( int i = 0 ; i < size; i++ )
  75.    {
  76.          m_vmatrix[i] = (matrix.m_vmatrix)[i];
  77.    }
  78.    */
  79.    //赋值操作有必要逐个进行吗?
  80.    m_vmatrix.clear(); //这句也是无必要的
  81.    m_vmatrix = matrix.m_vmatrix;

  82.    return *this;

  83. }

  84. MatrixNode::MatrixNode(const MatrixNode& tmpmatrix)
  85.         : m_x(tmpmatrix.m_x), m_y(tmpmatrix.m_y), m_vmatrix(tmpmatrix.m_vmatrix)
  86. {
  87.         /*
  88.    m_x = tmpmatrix.m_x;
  89.    m_y = tmpmatrix.m_y;
  90.    int size = m_x*m_y;
  91.    m_vmatrix.reserve(size);
  92.    for ( int i = 0 ; i < size; i++ )
  93.    {
  94.       m_vmatrix[i] = (tmpmatrix.m_vmatrix)[i];
  95.    }
  96.          */   
  97. }

  98. /**
  99.         *        这里不知道你进行比较的判断依据,但怎么看怎么别扭
  100.         *
  101. **/       
  102. bool MatrixNode::operator<(const MatrixNode &cmpmatrix) const
  103. {
  104.    int size = 0;
  105.    size = m_x*m_y;

  106.    for ( int i = 0; i < size; i++)
  107.    {
  108.       if ( m_vmatrix[i] < (cmpmatrix.m_vmatrix)[i] )
  109.          return true;
  110.    }

  111.    return false;

  112. }

  113. bool MatrixNode::operator==(const MatrixNode &cmpmatrix) const
  114. {
  115.    int size = 0;
  116.    size = m_x*m_y;

  117.    for ( int i = 0; i < size; i++)
  118.    {
  119.       if ( m_vmatrix[i] != (cmpmatrix.m_vmatrix)[i] )
  120.          return false;
  121.    }

  122.    return true;
  123. }

复制代码

论坛徽章:
0
3 [报告]
发表于 2005-10-03 22:27 |只看该作者

标准模板库 中 set 使用问题?

多谢renstone921 的指点,获益不少。


在错误里面也可以参见到
源代码要求比较操作符函数的参数是const
bool operator()(const _Ty& _X, const _Ty& _Y) const
所以出错了。

论坛徽章:
0
4 [报告]
发表于 2005-10-03 22:40 |只看该作者

标准模板库 中 set 使用问题?


  1. /**
  2.    *   这里不知道你进行比较的判断依据,但怎么看怎么别扭
  3.    *
  4. **/   

  5. bool MatrixNode::operator<(const MatrixNode &cmpmatrix) const
  6. {
  7.   int size = 0;
  8.   size = m_x*m_y;

  9.   for ( int i = 0; i < size; i++)
  10.   {
  11.      if ( m_vmatrix[i] < (cmpmatrix.m_vmatrix)[i] )
  12.         return true;
  13.   }

  14.   return false;

  15. }
复制代码


这个MatrixNode是用来表示一个旋转矩阵
如果用过Nokia手机的话,里面有个旋转排序的游戏。
我的程序是穷举它,证明可以旋转会原来的状态。

一个MatrixNode节点表示一个旋转状态,
这里的比较其实就是根据矩阵的一维化之后,进行比较
例如:
123
456
789
保存为:123456789
左上角旋转一次变为
413526789

论坛徽章:
0
5 [报告]
发表于 2005-10-03 22:45 |只看该作者

标准模板库 中 set 使用问题?

写这个程序主要是锻炼一下啊,水平太差了。

用set的话,它把所有数据都封装在里面了,不好做。

但如果全部数据结构自己写,又怕毛病多多。

不过,估计得写写,要不更加不懂了。

论坛徽章:
0
6 [报告]
发表于 2005-10-05 12:03 |只看该作者

标准模板库 中 set 使用问题?

hi,各位大师.我现在想知一下.在windows中网上银行的密码输入

器是怎搅的啊.我现在想用.不过不知怎弄出来的.请在线人士帮

菜鸟一下.或者直加我QQ吧448910122.因为是急用的.多谢先....
..
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP