C++中,<cstring>、<string.h>和<string>的关系,①这几个各在啥时候使用?需不需要命名空间?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++中,<cstring>、<string.h>和<string>的关系,①这几个各在啥时候使用?需不需要命名空间?相关的知识,希望对你有一定的参考价值。

②什么叫C++标准string类?有多少这样的标准?③什么叫标准类模板库STL?和前面的概念有什么关系?

首先string.h是C的,不是C++的,包括了操作C风格字符串的函数,如strcpy.strcmp,strcat,strlen等。C 语言里没有字符串这个数据类型,有的只是字符指针或字符数组,C风格字符串也就是以'\0'结尾的字符序列。

然后是cstring。在C++标准化之前,头文件有各种后缀名,如.h,.hpp,.hxx等,标准化之后规定头文件不带后缀名,同时原来的C标准头文件都在前面加了个"c",于是原来C里的string.h,在C++里就变成了cstring,同样的stdio.h,stdlib.h之类的都变成了cstdio、cstdlib一类。为了兼容C,大部分C++编译器都同时提供了这两个版本的头文件,可以认为string.h和ctring是一回事,你可以看一下你的编译器里include目录下的这两个文件,cstring只是简单的include了string.h而已。

所以当你需要使用strcpy.strcmp,strcat,strlen这一类的函数时,在C里include string.h,C++里include cstring或string.h都行。同时,因为C里没有namespace,所以这两个是不使用命名空间的。

最后是string,这个是C++的标准字符串库,定义了string这个类型,当你需要使用这个C++的字符串类时,需要包含这个头文件,同时需要使用std命名空间。

C++标准string类就是C++标准里定义的字符串类,C++标准是由C++标准委员会制定的,目前只有C++ 98这个标准,新的C++0x标准还在草案中。

C++ STL (Standard Template Library,标准模板库)是C++标准的一部分,是一个模板与算法的类集合。它可以使程序员很方便地实现一些标准的数据结构,比如队列、链表以及栈等。
参考技术A string.h文件为C++基本字符串处理过程。
CString类为MFC对于字符串处理的一些封装。
STL类库是对字符串或者相关类进行通用的、快速的、类数组的操作方式。string类是STL类库对于字符串操作的实现,比CString类而言,更好用一点。
C++标准String类一般所指就是std::string类。
参考技术B <string.h>是c里面的头文件,由于c++保持对c中<string.h>的兼容,因此这个文件在c++中通常写为<cstring>。<string>是c++自己的字符串的头文件,对字符串操作进行了优化,使其使用更加方便和高效,通常需要在std命名空间中使用。STL是标准模板库,是c++中用模板定义的一些基本的数据结构,比如vector,list等等,代替了c中的数组,链表操作,这些都是定义在std命名空间中的,因此需要在std中使用。

感知器算法——C++实现

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <cstdlib>
#include <algorithm>
#include <vector>
#include <stack>
#include <queue>
using namespace std;
#define SZ(v) ((int)(v).size())
#define max 1000
#define N 100
struct node

    int Element[N];//模式类元素
    int Sample;//类别
 Node[max];
int n;//模式类的维数
int m;//每个模式类的元素个数
node W_vector;//初始权向量
node Mid_vector[N];//修正后的权向量
node tem[N];
void Large_vector(node X[]) //样本的增广

    for(int j = 0; j <=  2 * m - 1; j ++)
        X[j].Element[n] = 1;

void Init(node *Quan) //初始权向量的初始化

    for(int j = 0; j <= n; j ++)
        Quan->Element[j] = 1;

int Mul_vector(node a,node b) //向量相乘,用以计算中间修正过程

    int Product = 0;//乘积
    for(int j = 0; j <= n; j ++)
        Product += a.Element[j] * b.Element[j];
    return Product;

node Add_vector(node a,node b)

    node Differ;
    for(int j = 0; j <= n; j ++)
        Differ.Element[j] = a.Element[j] + b.Element[j];
    return Differ;

node Dec_vector(node a,node b)

    node Differ;
    for(int j = 0; j <= n; j ++)
        Differ.Element[j] = a.Element[j] - b.Element[j];
    return Differ;

bool Judge_identical(node X[]) //判断迭代过程中是否出现权向量都相同

    int flag  = 0;//判断标志
    for(int l = 0; l <= 2 * m - 1; l ++)
        for(int s = l + 1; s <= 2 * m - 1; s ++)
            for(int t = 0; t <= n; t ++)
                if(X[l].Element[t] != X[s].Element[t])
                    return false;
    return true;

void Preceptron(node X[],node W[]) //感知器算法

    int i,j,l;
    int cum = 0;
    do
    
        int ags;
        for(i = 0; i <= 2 * m - 1; i ++)
        
            ags = Mul_vector(W[cum],X[i]);//求修正判断数
            if(i <= m - 1) //如果为第一类
            
                if(ags > 0) //结果大于0,则不用修正
                
                    tem[i] = W[cum];
                    cout<<"不修正"<<" W"<<cum+1<<endl;
                
                else
                
                    cout<<"修正"<<" W"<<cum+2<<"="<<" W"<<cum + 1<<" - x"<<i+1<<endl;
                    cum ++;
                    W[cum] = Add_vector(W[cum - 1] , X[i]);//为第一类的修改是当前权值加上使之要修改的样本值
                    tem[i] = W[cum];
                
            
            else
            
                if(ags < 0)
                
                    tem[i] = W[cum];
                    cout<<"不修正"<<" W"<<cum+1<<endl;
                
                else
                
                    cout<<"修正"<<" W"<<cum+2<<"="<<" W"<<cum + 1<<" - x"<<i+1<<endl;
                    cum ++;
                    W[cum] = Dec_vector(W[cum - 1] , X[i]);//为第二类的修改是当前权值减去使之要修改的样本值
                    tem[i] = W[cum];//保存权值,用于判断
                
            

        
    
    while(!Judge_identical(tem)); //判断是否达到跳出状态,即当某次修改后的权值都是一样的


int main()

    int i , j;
    cout<<"请输入模式类的维数:  ";
    cin>>n;
    cout<<"请输入每个模式类的样本数(这里按照两类w1,w2):  ";
    cin>>m;
    for(i = 0; i <= 2 * m - 1; i ++)
    
        for(j = 0; j <= n - 1; j ++)
        
            cin>>Node[i].Element[j];
        
    
    Large_vector(Node);
    Init(&Mid_vector[0]);
    Preceptron(Node,Mid_vector);
    return 0;


以上是关于C++中,<cstring>、<string.h>和<string>的关系,①这几个各在啥时候使用?需不需要命名空间?的主要内容,如果未能解决你的问题,请参考以下文章

在 C++ 中摆脱 CString 中的换行符

c++字符串使用

Visual Studio 2008中字符串头文件不是cstring是string?

如何得到C++中的list的某个元素值?

C++ string 基本用法

C++读写文件