C++问题---sizeof(string)问题

-------------------------------------
典型例题6 :C++问题---sizeof(string)问题;
-------------------------------------
 1    #include <iostream>
 2    #include <string>
 3   
 4    using namespace std;
 5   
 6    class mystring{
 7        friend ostream& operator<< (ostream& ostrm, const mystring& strData);
 8    public:
 9        mystring()
10        {
11            m_cpData = NULL;
12            m_nLength = 0;
13        }
14        ~mystring()
15        {
16            if (m_nLength != 0)
17                {
18                    delete m_cpData;
19                    m_cpData = NULL;
20                    m_nLength = 0;
21                }
22        }
23        void operator = (const char* cpData);
24        int length(void);
25   
26    protected:
27        const char* data(void) const;
28   
29    private:
30        char* m_cpData;
31        int  m_nLength;
32    };
33   
34    //重载"="运算符, 以便使用 string a = "wdd"这样的赋值
35    void mystring::operator = (const char* cpData)
36    {
37        m_nLength = strlen(cpData);
38        m_cpData = new char[m_nLength];
39        memset(m_cpData, 0, m_nLength);
40        memcpy(m_cpData, cpData, m_nLength);
41    }
42   
43    int mystring::length(void)
44    {
45        return m_nLength;
46    }
47    const char* mystring::data() const
48    {
49        return m_cpData;
50    }
51   
52    //重载"<<"运算符, 以便使用 cout << strData; 来输出字符串
53    ostream& operator<< (ostream& ostrm, const mystring& strData)
54    {
55        if (strData.m_nLength != 0)
56            {
57                ostrm << strData.m_cpData;
58            }
59        return ostrm;
60    }
61   
62    int main(void)
63    {
64        //定义(对象)变量
65        mystring strTestA, strTestB;
66        string strTestC;
67   
68        //赋值
69        strTestA = "Hello World";
70        strTestB = "World";
71        strTestC = "Hi";
72        //输出string的长度,三个值是一样的.
73        cout <<sizeof(mystring) << " " <<sizeof(strTestA) <<
74            " " <<sizeof(strTestB) <<
75            " " <<sizeof(string)<<" "<<sizeof(strTestC) << endl;
76   
77        //输出字符串的长度
78        cout << strTestA.length() <<" " << strTestB.length()<<" "<<strTestC.length()<< endl;
79   
80        //输出字符串
81        cout << strTestA << endl;
82        cout << strTestB << endl;
83        cout << strTestC << endl;
84        return 0;
85    }
--------------------------
haiping@ubuntu:~/program/yo0913$ ./a.out
8 8 8 4 4
11 5 2
Hello World
World
Hi
-------------------------
结果分析:
可以看到,我自己实现的string类类型大小为8(实际上为sizeof(char*)+sizeof(int)),如果增加一个私有变量int类型,这个sting类类型大小为12;而标准c++的string类类型大小为4,说明只有一个指针;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
0-1背包问题是一个经典的动态规划问题,其目标是在给定一组物品的重量和价值以及一个背包的容量限制下,选择一些物品放入背包,以便在不超过背包容量的前提下,使得背包中物品的总价值最大化。 一种常见的C语言实现0-1背包问题的方法如下: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> int max(int a, int b) { return (a > b) ? a : b; } int knapSack(int W, int wt[], int val[], int n) { int i, w; int **K = (int **)malloc((n + 1) * sizeof(int *)); for (i = 0; i <= n; i++) { K[i] = (int *)malloc((W + 1) * sizeof(int)); } for (i = 0; i <= n; i++) { for (w = 0; w <= W; w++) { if (i == 0 || w == 0) { K[i][w] = 0; } else if (wt[i - 1] <= w) { K[i][w] = max(val[i - 1] + K[i - 1][w - wt[i - 1]], K[i - 1][w]); } else { K[i][w] = K[i - 1][w]; } } } int result = K[n][W]; for (i = 0; i <= n; i++) { free(K[i]); } free(K); return result; } int main() { int n, W; scanf("%d%d", &n, &W); int *wt = (int *)malloc(n * sizeof(int)); int *val = (int *)malloc(n * sizeof(int)); for (int i = 0; i < n; i++) { scanf("%d%d", &wt[i], &val[i]); } int ans = knapSack(W, wt, val, n); printf("%d\n", ans); free(wt); free(val); return 0; } ``` 这个实现中使用二维数组K来保存每个子问题的最优解。首先,我们初始化一个大小为(n+1) x (W+1)的二维数组K,并将所有元素初始化为0。然后,我们使用两个嵌套的循环依次计算K的每个元素的值,直到得到整个问题的最优解。 以上是一个基本的0-1背包问题的C语言实现。你可以根据需要对其进行修改和优化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值