1. 程式人生 > >string 和 vector 初探

string 和 vector 初探

標準庫型別 string

        string 表示可變長的字元序列。是C++標準庫型別的一部分,擁有許多優秀的效能。

        定義 string 物件時如未人為初始化編譯器會預設初始化為空字串。

        string 物件的初始化有很多種,大體分為兩類:拷貝初始化直接初始化。所有用等號(=)的初始化都為拷貝初始化,相反不是等號則為直接初始化。當初始值只有一個時,拷貝和直接初始化都可,但需要用到多個值的時候,一般來說只能使用直接初始化。 建議儘量使用直接初始化。

string s1;//預設初始化為空串
string s2=s1;//拷貝初始化,s2是s1的副本
string s3(n,"c");//直接初始化,s3為連續n個c構成的字串

        在讀取 string 物件時,string 物件會自動忽略開頭的空白空格,製表符,執行符等)並從第一個真正的字元開始讀取直到遇見下一個空白為止。

        getline 函式可以讀取一整行包括字串中的空白,getline函式的引數是一個輸入流和一個 string 物件。將輸入流中讀取的一行字串存入 string 物件中。當 getline 遇到轉行符時就結束並返回結果(getline 是讀取轉行符的,但是結果中是將轉行符丟棄的)。

string line;
while(getline(cin,line))//反覆讀取輸入流,知道遇見結束標誌EOF
         cout<<line<<endl;輸出每一行並手動新增換行操作

        string 的 size()(string 類的封裝函式) 操作返回 string 物件的長度,返回型別為 string::size_type,這是一個神祕的型別生氣,只知道它是一個無符號整形,並且能存放下任何 string 物件的大小。既然函式返回值是無符號整數就不能與有符號數進行比較,因為當無符號數與負值比較時,負值會自動轉變為一個比較大的無符號數,使比較結果出錯。

string line;
auto len = line.size();//len 是size_type型別,值為0,line 是個空串

       string 類定義了比較字串的運算子,當兩個 string 物件完全相同時,這兩個string 相等(==);

       其他比較如 < ‘,<= ,> ,>= ,string 物件遵循兩個原則:

              1.當一個string 物件A長度小於 string 物件B長度,且A與B於A長度上的字元皆相同時,A < B;

              2.如果兩個 string 物件在某些對應的位置上不一致,則string 物件比較的結果是第一個相異字元比較的結果(遵循大小寫敏感的字典序)。

string str = "Hello";
string phrase = "Hello World";
string slang = "Hiya";
//由規則 1 判斷,phrase 大於 str;由規則 2 判斷 phrase 大於 str 和 slang

        string 物件過載了 + 運算子,通過 + 運算子可以實現 string 與string ,字面值及字串字面值之間的銜接。(字串字面值與 string 是不同的型別)字面值及字串字面值不能直接相加,因為 + 運算子是封裝與 string 類中的。

string s1("Hello") , s2(" World");
string s3 = s1 + s2;//s3 的內容是 Hello World
string s4 = s1 + ',';//s4 的內容是 Hello,
string s5 = s1 + ", World";//s5 的內容是 Hello, World

標準庫型別 vector

        vector 表示同一種物件的集合。vector 是一個類模板,vector 本身不是類,但卻是編譯器生成類的說明,當使用模板例項化類時必須指明例項化成何種型別,vector 使用尖括號 <> 來指明例項化型別。vector 能容納絕大多數物件作為其元素(引用除外,引用不是物件),甚至 vector 本身。

        vector 的初始化同 string 相同,另外C++11 還為 vector 添加了列表初始化的方法。用花括號括起來的0個或多個初始元素值被賦給 vector 物件。

vector<string> vs = {"cs","dn"};

        列表初始化會給閱讀帶來混淆,因為列表中的值既可以表示初始值也可以表示元素數量,編譯器會首先認為是列表初始化(將列表中的值當作初始值來處理),如果不行,才會考慮其他初始化方式。

vector<int> v1(10);//v1有10個元素,都為0
vector<int> v2{10};//v2有1個元素,為10
vector<int> v3(10,1);//v3有10個元素,都為1
vector<int> v4{10,1};//v4有兩個元素,10和1
vector<string> v5{"Hello","Hi"};//v5有兩個元素,列表初始化
vector<string> v6{10};//v6有10個空串元素

        向 vector 中新增元素必須使用 vector 的成員函式 push_back() ,將一個值新增到 vector 的末尾。不能使用下標運算子。下標運算子只是用來訪問 vector(string) 物件已存在的元素。下標運算子的使用必須確保其在合理範圍內(大於 0 且小於容量)。

        vector若要使用 size_type 型別必須明確指出其是由哪一型別定義的。

vector<int>::size_type;//正確
vector::size_type;//錯誤

        vector 物件中元素的只有在元素本身支援比較運算子的基礎上才能進行比較(有些自定義類並沒有定義比較運算子)。

範圍 for 語句

         範圍 for 語句遍歷給定範圍內的每一個元素,並對序列(序列可以是用花括號括起來的初始值列表,陣列,vector,string等物件,這些型別的共同特點是擁有能返回迭代器的 begin end 成員)中的每一個元素進行某種操作。使用範圍 for 語句可以無需關係是否超出有效範圍。

string str("Hello World");
for(auto c : str)//遍歷 str 每一個字元元素
     cout<< c <<endl;

相關推薦

string vector 初探

標準庫型別 string         string 表示可變長的字元序列。是C++標準庫型別的一部分,擁有許多優秀的效能。         定義 string 物件時如未人為初始化編譯器會預設初始化為空字串。         string 物件的初始化有很多種,大體分為

談談兩種標準庫類型---stringvector

指針 word 叠代器類型 iss 組成 pty namespace 拷貝 col 兩種最重要的標準庫---string和vector string和vector是兩種最重要的標準庫類型,string表示可變長的字符序列,vector存放的是某種給定類型對象的可變長序列。

c++ 中stringvector中的pop_back push_back的練習

C++中的string和vectorExample 1: 輸入一行字元的集合,遇到換行符結束輸入,並且判斷這個字串物件中的大寫、小寫、空格、數字、以及其他符號個數。Code:#include<iostream> #include<string> //

C++中stringvector用法總結

string 包含標頭檔案:#include<string> 申明名稱空間:using std::string ; 1)       初始化 string s1;   //Default initialization; s1 is an empty string

C/C++中stringvector的一些擴充套件

關於vector:轉自 點選開啟連結 向量容器(vector)是一種順序容器,是一塊連續分配的記憶體,支援隨機訪問,從資料安排的角度看,和陣列極其相似,陣列跟vector的區別在於:陣列是靜態分配空間,一旦分配了空間的大小,就不可以再改變了,例如,int a[6];而

stringvector下標運算子

vector的size函式返回vector物件中元素的個數,返回值的型別由vector定義的size_type型別。要使用size_type,需首先指定它是由哪種型別定義的。vector物件的型別總是包含著元素的型別: vector<int>:

stringvector

string是支援長度可變的字串,c++的標準庫負責管理與儲存字元相關的記憶體目標滿足對字串的一般應用。 必須包含標頭檔案string。 在定義和初始化中注意他的一個初始化函式string s(n,‘c’);的意思的將s初始化為字元“c”的n個副本 他與字串字面值和strin

迭代器:訪問string物件vector物件

我們都知道可以用下標運算來訪問string物件和vector物件。而另外還有一種更通用的方法也可以實現這樣的方法。名曰:迭代器(iterator)。 類似於指標,迭代器也提供了對物件的間接訪問。就迭代器而言,其物件是容器中的元素或者string中的字元。使

dll中介面中使用std::stringstd::vector

最近在windows下封裝dll給客戶,介面引數型別都是std::string,直接在release模式下生成,客戶也沒什麼反饋。但是自己線下在debug模型下測試的時候引數始終傳遞不過去,除錯覺得記憶

筆記2 (標準庫型別stringvectorbitset)

抽象資料型別(abstract data type) 通常,標頭檔案中應該只定義確定必要的東西 標準庫string 型別 #include<string> using  std::string; string的定義和初始化 string型別的輸入操作符:

Rxjava observeOn()subscribeOn()初探

所在 ride 多個 div ner ons android開發 alpha 距離 Rxjava這麽強大的類庫怎麽可能沒有多線程切換呢? 其中observeOn()與subscribeOn()就是實現這樣的作用的。本文主要講解observeOn()與subscribeOn(

自動拆裝箱,string基本數據類型的相互轉換

integer sta intval stat ger main package bsp div 1 package com.pang.demo1; 2 3 public class Demo01 { 4 public static void main(

ArrayListVector、LinkeList的區別

簡單 查找 應該 線性表 n) 長度 數組元素 哈希表 util Arraylist和Vector是采用數組方式存儲數據,此數組元素數大於實際存儲的數據以便增加插入元素,都允許直接序號索引元素,但是插入數據要涉及到數組元素移動等內存操作,所以插入數據慢,查找有下標,所以查詢

JavaScript中StringJSON互換

轉為json 對象 沒有 解析 字符 hack json字符串 span rgb 最簡答的方式是:JSON.parse(obj) 將json對象解析為json字符串JSON.stringify(str) 將json字符串轉為json對象。需要註意的是早期的IE瀏覽器是沒有J

Java StringDate的轉換 轉http://www.cnblogs.com/bmbm/archive/2011/12/06/2342264.html

ref integer public cat 標記 星期 import 轉換 star Java String和Date的轉換 String—>Date方法一: String dateString = "2012-12-06 "; try {

Stringstringbuffer

args 不同 abcd insert 字體位置 避免 類型 ava col  很多人都會認為,String和StringBuffer沒有多大的區別,但是String與StringBuffer的區別,就是一個變量和常量的關系。 StringBuffer對象的內容可以修

StringStringBuilder、StringBuffer的區別?

stringbu 其中 線程 沒有 平臺 zed 對象 修飾 java平臺 Java平臺提供了兩種類型的字符串:String和StringBuffer/StringBuilder,它們可以儲存和操作字符串。其中String是只讀字符串,也就意味著String引

StringStringBuffer相關

mage -- edi 實參 設置 自己 span 也會 但是 在http://www.cnblogs.com/aishangJava/p/7262577.html這裏看到了一個題目,就去嘗試了一下,代碼如下: /* * To change this template,

亂碼問題引申 python 中stringunicode

-c 錯誤方法 odin 版本 需要 content 2.7 encode 我們 HtmlTestRunner的亂碼問題 1生成的報告中,對print打印的數據都記錄下來,但是數據有些會存在亂碼。如下面。有些又沒有亂碼。 這到底是怎麽回事呢?

StringStringBuffer互相轉換

cnblogs 同時 log 字符數 spa 其中 也會 app blog String:不可變 StringBuffer:可變 StringBuffer 上的任何修改性的操作都是在同一個字符數組上進行的,所以修改其中任一個值 另一個的值也會隨著改變! StringB