谈谈两种标准库类型---string和vector

两种最重要的标准库---string和vector

string和vector是两种最重要的标准库类型,string表示可变长的字符序列,vector存放的是某种给定类型对象的可变长序列。

一、标准库类型string

  1.定义和初始化string对象:初始化string对象的方式有

string s1   默认初始化,s1是一个空串   string s2(s1)   s2是s1的副本

string s2=s1   等价于s2(s1),s2是s1的副本

string s3("value")  s3是字面值"value"的副本,除了字面值最后的那个空字符外

string s3="value"  等价于s3("value"),s3是字面值"value"的副本

string s4(n,‘c‘)  把s4初始化为由连续n个字符c组成的串

如果使用等号(=)初始化一个变量,实际上执行的是拷贝初始化,编译器把等号右侧的初始值拷贝到心创建的对象中去。与之相反,如果不使用等号,则执行的是直接初始化。

2.string对象上的操作

os<<s  将s写到输出流os当中,返回os    is>>s  从is中读取字符串赋给s,字符串以空白分隔,返回is

getline(is,s)  从is中读取一行赋给s,返回is    s.empty()  s为空返回true,否则返回false

s.size()  返回s中字符的个数    s[n]  返回s中第n个字符的引用,位置n从0计起

s1+s2   返回s1和s2连接后的结果   s1=s2   用s2的副本代替s1中原来的字符

s1==s2  s1!=s2  如果s1和s2中所含的字符完全一样,则他们相等;string对象的相等性判断对字母的大小写敏感

读取未知数量的string对象:

#include <iostream>#include <string>
using namespace std;
int main()
{
   string word;
   while(cin>>word)
     cout<<word<<endl;
   return 0;
}

使用getline()读取一整行:

getline函数的参数是一个输入流和一个string对象,函数从给定的输入流中读入内容,直到遇到换行符为止(注意换行符也被读进来了),然后把所读的

内容存入到那个string对象中去(注意不存换行符)。

#include <iostream>
#include <string>
using namespace std;
int main()
{
   string line;    //每次读入一整行,直到达文件末尾
   while(getline(cin,line))
     cout<<line<<endl;
   return 0;
}

string的empty和size操作:

empty函数根据string对象是否为空返回一个对应的布尔值,empty也是string的一个成员函数。

#include <iostream>
#include <string>
using namespace std;
int main()
{
   string line;
   while(getline(cin,line))   //每次读入一整行,遇到空行直接跳过
     if(!line.empty())
       cout<<line<<endl;
   return 0;
}

size函数返回string对象的长度(即string对象中字符的个数)

#include <iostream>
#include <string>
using namespace std;
int main()
{
   string line;
   //每次读入一整行,输出其中超过100个字符的行
   while(getline(cin,line))
     if(line.size()>100)
       cout<<line<<endl;
   return 0;
}

处理string对象中的字符:使用基于范围的for语句

范围for语句:这种语句遍历给定序列中的每个元素并对序列中的每个值执行某种操作,

for (declaration : expression)

statement

其中,expression部分是一个对象,用于表示一个序列。declaration部分负责定义一个变量,该变量将被用于访问序列中的基础元素。每次迭代,

declaration部分的变量会被初始化为expression的下一个元素值。

#include <iostream>
#include <string>
#include <ctype.h>
using namespace std;
int main()
{
    string s("hello world!!!");
    for (decltype(s.size()) index = 0;index != s.size() && !isspace(s[index]);++index)
        s[index] = toupper(s[index]);
    cout << s << endl;
    /*decltype(s.size()) punct_cnt = 0;
    for (auto c : s)
        if (ispunct(c))
            ++punct_cnt;
    cout << punct_cnt
        << " punctuation characters in "
        << s << endl;*/
    /*for (auto & c : s)
        c = toupper(c);
    cout << s << endl;*/
    getchar();
    return 0;
}

二、标准库类型vector

1. 标准库类型vector表示对象的集合,其中所有对象的类型都相同。集合中的每个对象都有一个与之对应的索引,索引用于访问对象。因为vector容纳着其他对象,

所以它也被称作容器。

vector能容纳绝大多数类型的对象作为其元素,但是因为引用不是对象,所以不存在包含引用的vector。除此之外,其他大多数(非引用)内置类型和类类型都可

以构成vector对象,甚至组成vector的元素也可以是vector。

2. 定义和初始化vector对象

和任何一种类类型一样,vector模板控制着定义和初始化向量的方法。

vector<T> v1    v1是一个空vector,它潜在的元素是T类型的,执行默认初始化     vector<T> v2(v1)    v2中包含有v1所有元素的副本

vector<T> v2=v1   等价于v2(v1),v2中包含有v1所有元素的副本   vector<T> v3(n,val)   v3包含了n个重复的元素,每个元素的值都是val

vector<T> v4(n)   v4包含了n个重复地执行了值初始化的对象   vector<T> v5{a,b,c...}  v5包含了初始值个数的元素,每个元素被赋予相应的初始值

vector<T> v5={a,b,c...}    等价于v5{a,b,c...}

3. vector支持的操作

v.empty()  如果v不含有任何元素,返回真;否则返回假     v.size()  返回v中元素的个数

v.push_back(t)   向v的尾端添加一个值为t的元素   v[n]  返回v中第n个位置上元素的引用

v1=v2  用v2中元素的拷贝替换v1中的元素   v1={a,b,c...}  用列表中元素的拷贝替换v1中的元素

v1==v2  v1和v2相等当且仅当它们的元素数量相同且对应位置的元素值都相同    v1!=v2

4. 向vector对象中添加元素

#include <iostream>
#include <vector>
using namespace std;
int main()
{
    vector<int> v;
    int a;
    while (cin >> a ,a!=-1)
        v.push_back(a);
    for(auto i : v)
    cout << i << endl;
    system("pause");
    return 0;
}

5. 使用迭代器

使用迭代器可以访问某个元素,迭代器也能从一个元素移动到另外一个元素。迭代器有有效和无效之分,这一点和指针差不多。有效的迭代器或者指向某个元素,或者

指向容器中尾元素的下一个位置;其他所有情况都属于无效。这些类型都拥有名为begin和end的成员,其中begin成员负责返回指向第一个元素(或第一个字符)的迭代器。

end成员则负责返回指向容器(或string对象)“尾元素的下一个位置”的迭代器,该迭代器指示的是容器的一个本不存在的“尾后”元素。end成员返回的迭代器常被称作尾后

迭代器或者简称为尾迭代器。特殊情况下如果容器为空,则begin和end返回的是同一个迭代器。

标准容器迭代器的运算符:

*iter   返回迭代器iter所指元素的引用     iter->mem  解引用iter并获取该元素的名为mem的成员,等价于(*iter).mem

++iter  令iter指示容器中的下一个元素     --iter  令iter指示容器中的上一个元素

iter1==iter2   iter1 != iter2   判断两个迭代器是否相等(不相等),如果两个迭代器指示的是同一个元素或者它们是同一个容器的尾后迭代器,则相等;反之,不相等

#include <iostream>
#include <vector>
#include <string>
#include <ctype.h>
using namespace std;
int main()
{
    string s("some string");
    if (s.begin() != s.end())
    {
        auto it = s.begin();
        *it = toupper(*it);
    }
    cout << s << endl;
    system("pause");
    return 0;
}
#include <iostream>
#include <vector>
#include <string>
#include <ctype.h>
using namespace std;
int main()
{
   string s("some string");
   if (s.begin() != s.end())
    {
        for (auto it = s.begin();it != s.end() && !isspace(*it);++it)
            *it = toupper(*it);
    }
    cout << s << endl;
    system("pause");
    return 0;
}

迭代器类型:拥有迭代器的标准库类型使用iterator和const_iterator来表示迭代器的类型。const_iterator和常量指针差不多,能读取但不能修改它所指的元素值。

相反,iterator的对象可读可写。如果vector对象或string对象是一个常量,只能使用const_iterator;如果vector对象或string对象不是常量,那么既能使用iterator也能

使用const_iterator。

begin和end运算符:begin和end返回的具体类型由对象是否是常量决定,如果对象是常量,begin和end返回const_iterator;如果对象不是常量,返回iterator。为了

便于得到const_iterator类型的返回值,引入了两个新函数,分别是cbegin和cend,类似于begin和end,两个新函数也分别返回指示容器第一个元素或最后元素下一个

位置的迭代器。不同的是,不论vector对象(或string对象)本身是否是常量,返回值都是const_iterator。

#include <iostream>
#include <vector>
#include <string>
#include <ctype.h>
using namespace std;
int main()
{
    string s("some string");
    if (s.begin() != s.end())
        for (auto it = s.cbegin();it != s.cend() && !s.empty();++it)
            cout << *it;
    cout << endl;
    system("pause");
    return 0;
}

原文地址:https://www.cnblogs.com/XNQC1314/p/8076240.html

时间: 2024-10-13 23:28:04

谈谈两种标准库类型---string和vector的相关文章

3.2 标准库类型string(上)

#include <string> #include <iostream> using std::string; using std::cin; using std::cout; using std::endl; //string定义在命名空间std中 int main() { /**************3.2.1 定义和初始化string*****************/ string s1; //默认初始化,S1是一个空字符串 string S2 = s1; //S2时S

C++标准库类型string

string类表示可变长字符序列,包含在头文件string中,作为标准库的一部分string定义在std命名空间中 1.初始化string对象 std::string s1;//默认初始化s1是个空字符 std::string s2 = s1;//s2是s1的副本 std::string s3 = "hello";//s3是该字符串字面值的副本 std::string s4(10,'h');s4的内容是hhhhhhhhhh 直接初始化和拷贝初始化 初始化时用到=号的就是拷贝初始化,其在

3.2 标准库类型string(下)

#include <iostream> #include <string> using std::cin; using std::cout; using std::endl; using std::string; /*------------------范围for语句----------------*/ /* for(declartion:expression) statement expression部分是一个对象,用于表示一个序列. declartion部分负责定义一个变量,该

标准库类型String

string对象中每个字符的处理: 要用到 for(声明:表达式) 语句 比如简单的打印string str中每一个字符 --- string str("hello world!!!"); for(auto c: str)cout<<c<<endl; (ps:这里auto 的意思是让编译器自己来决定c变量的类型) --- 再举一个例子统计string str的标点符号数目 string str("hello world!!!"); declt

C++ Primer 第四版读书笔记(二)之标准库类型

C++定义了一个内容丰富的抽象数据类型标准库,其中最重要的标准库类型是string和vector,它们分别定义了大小可变的字符串和集合.string和vector往往将迭代器用作配套类型,用于访问string中的字符,或者vector中的元素. 另一种标准库类型为bitset,提供了一种抽象方法来操作位的集合. string类型支持长度可变的字符串,vector用于保存一组指定类型的对象. bitset类标准库类型提供了更方便和合理有效的语言级的抽象设施.通过这个类可以把某个值当作位的集合来处理

【C++ Primer每日一刷之五】标准库类型小结

标准库类型小结 C++ 标准库定义了几种更高级的抽象数据类型,包括 string 和 vector 类型.string 类型提供了变长的字符串,而 vector 类型则可用于管理同一类型 的对象集合.迭代器实现了对存储于容器中对象的间接访问.迭代器可以用于访问和遍历 string 类型和vectors 类型的元素.下一节将介绍 C++ 的内置数据类型:数组和指针.这两种类型提供了类似于 vector 和 string 标准库类型的低级抽象类型.总的来说,相对于C++ 内置数据类型的数组和指针而言

C++ Primer 学习笔记_6_标准库类型 -- 命名空间using与string类型

 标准库类型(一) --命名空间using与string类型 引: 标准库类型是语言组成部分中更基本的哪些数据类型(如:数组.指针)的抽象! C++标准库定义的是高级的抽象数据类型: 1.高级:因为其中反映了更复杂的概念: 2.抽象:因为我们在使用时不需要关心他们是如何表示的,我们只需要知道这些抽象数据类型支持哪些操作就可以了. 正文: 一.命名空间的using声明 1. using std::cin; ::运算符的作用含义是右操作数的名字可以在左操作数的作用域中找到. 格式: [cpp]

C++拾遗(二)——初窥标准库类型

本篇博文的开始,先介绍一道书上看到的智力题:有20瓶药丸,其中19瓶装有1克/粒的药丸,余下一瓶装有1.1克/粒的药丸.有一台称重精准的天平,只是用一次天平的情况下如何找出比较重的那瓶药丸? 好了,直接公布答案.从药瓶#1取出一粒药丸,从药瓶#2取出两粒,从药瓶#3取出三粒,依此类推.如果每粒药丸均重1克,则称得总重量为210克(1 + 2 + … + 20 = 20 * 21 / 2 = 210),“多出来的”重量必定来自每粒多0.1克的药丸.药瓶的编号可由算式(weight - 210 gr

C++ Primer 学习笔记_8_标准库类型(续2) -- iterator

 标准库类型(三) --iterator 序言: 迭代器是一种检查容器内元素并遍历容器元素的数据类型. 所有的标准库容器都定义了相应的迭代器类型,而只有少数的容器支持下标操作:因此,现代C++更倾向于使用迭代器而不是下标操作访问容器元素. 正文: 1.容器的iterator类型 每个标准库容器类型都定义了一个名为iterator的成员: [cpp] view plaincopyprint? vector<int>::iterator iter; vector<int>::ite