LinuxSir.cn,穿越时空的Linuxsir!

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

C++ 菜鸟的问题(2)

[复制链接]
发表于 2008-5-25 22:18:33 | 显示全部楼层 |阅读模式
下面是一个求逆序数排序的程序。
目的是解一道题题目为
http://acm.pku.edu.cn/JudgeOnline/problem?id=1007

程序如下
  1. #include <iostream>
  2. #include <vector>
  3. #include <string>
  4. class DNA{
  5. public:
  6.         int get_input();
  7.         int get_rank();
  8.         int sort_rank ( );
  9. private:
  10.         std::vector<std::string> m_dna_list;
  11.         int get_order(char a);
  12.         std::vector< std::pair< int,int> > m_rank;
  13. };
  14. int DNA::get_order(char a)
  15. {
  16.         switch(a) {
  17. case 'A':
  18.         return 0;
  19. case 'C':
  20.         return 1;
  21. case 'G':
  22.         return 2;
  23. case 'T':
  24.         return 3;
  25.         }
  26.         return -1;
  27. }
  28. int DNA::get_input ( )
  29. {
  30.         int n;
  31.         std::string input_string;
  32.         std::cin >> n;
  33.         for (int i=0;i<n;i++) {
  34.                 std::cin >> input_string;
  35.                 m_dna_list.push_back(input_string);
  36.         }
  37.         return 0;
  38. }
  39. int DNA::sort_rank()
  40. {
  41. //?????????
  42. }
  43. int DNA::get_rank ( )
  44. {
  45.         int p[4];
  46.         int fake_char;
  47.         int rank[4];
  48.         int word_occur;
  49.         std::vector<std::string>::size_type n;
  50.         n = m_dna_list.size();
  51.         for (std::vector<std::string>::size_type i=0;i<n;i++) {
  52.                 std::string &pstring = (m_dna_list[i]);
  53.                 rank[0]=rank[1]=rank[2]=rank[3]=0;p[0]=p[1]=p[2]=p[3]=0;
  54.                 for (int j=1;j<4;j++) {
  55.                         word_occur = 0;
  56.                         for (std::string::size_type k = pstring.size(); k > 0 ; k--) {
  57.                                 if (get_order(pstring[k-1]) == j)  {
  58.                                         rank[j] += p[j];
  59.                                         p[j]=rank[j]; //update rank
  60.                                         word_occur = 1;
  61.                                 }else if (get_order(pstring[k-1]) < j)
  62.                                         rank[j]++;                               
  63.                         }
  64.                         if (word_occur == 0) rank[j] = 0;
  65.                 }
  66.                 m_rank.push_back( std::pair<int,int>(i,p[0]+p[1]+p[2]+p[3]) );
  67.         }
  68.         return 0;
  69. }
  70. int main( )
  71. {
  72. DNA dna;
  73. dna.get_input();
  74. dna.get_rank();
  75. dna.sort_rank();
  76. return 0;
  77. }
复制代码
问题1:
for (std::string::size_type k = pstring.size(); k > 0 ; k--) {
好恶心得用法阿,我明明知道 k 为 size_t
问题2: 如何排序
std::vector< std::pair< int,int> > m_rank;
pair 中的第一项为一个数值,第二项为对应string vector的下标要以第一项排序,主要想利用范型算法
例如:
pair<int,int>(5,1)
pair<int,int>(6,2)
pair<int,int>(3,3)

===>

pair<int,int>(3,3)
pair<int,int>(5,1)
pair<int,int>(6,2)

问题3: C++容器怎么这么恶心啊
发表于 2008-5-26 03:24:56 | 显示全部楼层
1.
- 在 include 之后加上 using namespace std; 那么你就不用写那么多 std::
- string::size_type 应该不是 size_t。string::size_type 是有符号的。

2. sort(m_rank.begin(),m_rank.end()); 不可以吗?

3. 我想你指的是 STL?这是很早之前的标准了,恐怕不够 powerful。所以,才会需要 Boost 作为补充。
回复 支持 反对

使用道具 举报

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

本版积分规则

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