STL--线性容器 string
Posted 蚍蜉撼树谈何易
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了STL--线性容器 string相关的知识,希望对你有一定的参考价值。
STL线性容器--string
string介绍
在C++下为按照类的方式动态管理字符串。
底层:是一种顺序表的结构,元素是char类型的字符
string提出的意义:
1.string不用担心内存越界的问题。用字符数组的话你还要担心越界的问题,但用string类不用担心这个问题,原因是底层提供相应的扩容机制。
2.在拷贝方面来说,更加的方便。不用担心拷贝所带来的数据丢失等问题。
3.string底层有一套自身的内存管理体系,不用担心其内存泄露问题,底层有自己对资源的申请、释放机制。
string 不是一种类型,而是对char*的封装的一个类。
接下来介绍一下SGI版本(Linux)下的string类的相关函数
string类的大小
底层为8个字节。在PJ版本(vs2013)为28个字节。后面会给出模拟实现。
构造函数
//无参构造
string ( );
//拷贝构造
string ( const string& str );
//区间构造
string ( const string& str, size_t pos, size_t n = npos );
//拷贝字符指针所指空间的前n个元素
string ( const char * s, size_t n );
//拷贝字符指针所指的空间的内容
string ( const char * s );
//利用n个字符来初始化string对象
string ( size_t n, char c );
//利用迭代器构造
template<class InputIterator> string (InputIterator begin, InputIterator end);
6 void test_constructor()
7 {
8 //1.无参构造
9 string s1;
10 //2参数为const char*构造
11 string s2("hello Srting");
12 //3.拷贝构造
13 string s3(s2);
14 //4.区间构造
15 string s4(s2,0,5);
16 //5.字符构造
17 string s5(10,'c');
18 const char*str="hello world";
19 //6.迭代器构造
20 string s6(s2.begin(),s2.begin()+5);
21 //7.参数为char* size_t n的构造
22 string s7(str,5);
23 cout<<s1<<endl;
24 cout<<s2<<endl;
25 cout<<s3<<endl;
26 cout<<s4<<endl;
27 cout<<s5<<endl;
28 cout<<s6<<endl;
29 cout<<s7<<endl;
30 }
赋值运算符的重载
//将一个string对象赋值给另一string对象
string& operator= ( const string& str );
//利用指针所指空间的内容初始化string对象
string& operator= ( const char* s );
//单个字符直接给string对象
string& operator= ( char c );
31 // 2.测试赋值运算符
32 void test_fuzhi()
33 {
34 //1.参数为const string &t的
35 string s1("hello Linux");
36 string s2=s1;
37 //参数为const char*的
38 string s3="hello ubuntu";
39 //3.参数为字符类的
40 string s4;
41 s4='g';
42 cout<<s2<<endl;
43 cout<<s3<<endl;
44 cout<<s4<<endl;
45 }
测试string下的迭代器
迭代器:迭代器是一种类似指针的对象,而指针的各类行为中最常见也是最重要的便是内容提领和成员的访问,因此,迭代器的最重要的作用是对operator*和operator->进行重载的工作。迭代器是一种智能指针。
//3.迭代器测试
47 void test_Iterator()
48 {
49 string s1="hello Linux";
50 //1.正向迭代器 begin(),end() 左闭右开,
W> 51 int i=0;
52 string::iterator it =s1.begin();
53 while(it!=s1.end())
54 {
55 cout<<*it<<" ";
56 ++it;
57 }
58 cout<<endl;
59 // 反向迭代器遍历 rbegin(),rend();
60 string::reverse_iterator rit=s1.rbegin();
61 while(rit!=s1.rend())
62 {
63 cout<<*rit<<" ";
64 ++rit;
65 }
66 cout<<endl;
67 }
测试容量与大小
68 // 测试容量与大小
69 void test_size()
70 {
71 string s1("hello Linux");
72 cout<<s1<<endl;
73 cout<<s1.size()<<endl;
74 cout<<s1.capacity()<<endl;
75 string s2(100,'c');
76 size_t ret=s2.size();
77 cout<<s2<<endl;
78 int i=100;
79 cout<<ret<<endl;
80 for(;i>=0;i--)
81 {
82 s2.reserve(i);
83 cout<<s2.capacity()<<endl;
84
85 }
86 //cout<<s2.size()<<endl;
87 //cout<<s2.capacity()<<endl;
88 //s2.reserve(1);
89 //cout<<s2.size()<<endl;
90 //cout<<s2.capacity()<<endl;
91 // s1.reserve(20);
92 // cout<<s1.capacity()<<endl;
93 // s1.reserve(30);
94 // cout<<s1.capacity()<<endl;
95 //
96 // s1.reserve(50);
97 // cout<<s1.capacity()<<endl;;
98 }
//测试SGI版本下的string扩容机制
99 void test_reserve()
100 {
101 int i=0;
102 string s1;
103 int oldsize=s1.capacity();
104 for(;i<100;i++)
105
106 {
107 s1.push_back('c');
W>108 if(oldsize!=s1.capacity())
109 {
110 cout<<s1.capacity()<<endl;
111 oldsize=s1.capacity();
112 }
113 }
114 }
二倍扩容
115 //测试clear empty
116 void test_clear_empty()
117 {
118 string s1="hello world";
119 cout<<s1.size()<<endl;
120 cout<<s1.capacity()<<endl;
121 if(s1.empty())
122 {
123 cout<<"空"<<endl;
124 }
125 else
126 {
127 cout<<"非空"<<endl;
128 }
129 s1.clear();
130
131 cout<<s1.size()<<endl;
132 cout<<s1.capacity()<<endl;
133 if(s1.empty())
134 {
135 cout<<"空"<<endl;
136 }
137 else
138 {
139 cout<<"非空"<<endl;
140 }
141 }
获取元素
// 测试[] and at
143 void test_at()
144 {
145 int i=0;
146 string s("hello Linux");
W>147 for(;i<s.size();i++)
148 {
149 cout<<s[i]<<" ";
150
151 }
152 cout<<endl;
153 i=0;
W>154 for(;i<s.size();i++)
155 {
156 cout<<s.at(i)<<" ";
157
158 }
159 cout<<endl;
160 }
string类的修改
168 //测试+=
169 void test_modify()
170 {
171 //第一种 string& operator+= ( const string& str );
172 string s1="hello ";
173 string s2="world";
174 s1+=s2;
175 cout<<s1<<endl;
176 //第二中 string& operator+= ( const char* s );
177 string s3="hello";
178 s3+=" world";
179 cout<<s3<<endl;
180 //第三种 string& operator+= ( char c );
181 string s4="hell";
182 s4+='o';
183 cout<<s4<<endl;
184 }
185 void test_append()
186 {
187 //第一种 string& append ( const string& str );
188 string s1("hello");
189 string s2(" world");
190 s1.append(s2);
191
192 cout<<s1<<endl;
193 //第二种string& append ( const string& str, size_t pos, size_t n );
194 string s3;
195 s3.append(s2,1,5);
196 cout<<s3<<endl;
197 //第三种 string& append ( const char* s, size_t n );
198 const char*str="precious";
199 string s5;
200 s5.append(str,5);
201 cout<<s5<<endl;
202 //第四种string& append ( const char* s );
203 string s6("hello");
204 s6.append(" world");
205 cout<<s6<<endl;
206 //第五种 string& append ( size_t n, char c );
207 string s7;
208 s7.append(10,'c');
209 cout<<s7<<endl;
210 //第六种,迭代器方式
211 string s8("hello Linux");
212 string s9;
213 s9.append(s8.begin(),s8.begin()+5);
214 cout<<s9<<endl;
215 }
//测试erase
216 void test_erase()
217 {
218 //第一种 string& erase ( size_t pos = 0, size_t n = npos );
219 string s1("hello Linux");
220 s1.erase(0,5);
221 cout<<s1<<endl;
222 //第二种 iterator erase ( iterator position );
223 string s2("hello Linix");
224 string::iterator it=s2.begin();
225 while(it!=s2.end())
226 {
227 it=s2.erase(s2.begin());
228 }
229 cout<<s2<<endl;
230 cout<<s2.size()<<endl;
231 cout<<s2.capacity()<<endl;
232 //第三种: iterator erase ( iterator first, iterator last );
233 string s3("hello Linux");
234 string::iterator rit=s3.erase(s3.begin(),s3.begin()+5);
235 while(rit!=s3.end())
236 {
237 cout<<*rit;
238 rit++;
239 }
240 cout<<endl;
241 }
//测试swap
242 void test_swap()
243 {
244 // void swap ( string& str );
245 string s1("hello");
246 string s2("Linux");
247 cout<<"before swap"<<endl;
248 cout<<"s1="<<s1<<endl;
249 cout<<"s2="<<s2<<endl;
250 swap(s1,s2);
251 cout<<"after swap"<<endl;
252 cout<<"s1="<<s1<<endl;
253 cout<<"s2="<<s2<<endl;
254
255 }
测试string下的operation
npos=-1
256 void test_c_str()
257 {
258 //const char* c_str ( ) const;
259 string s1("hello Linux");
260 const char*s2=s1.c_str();
261 cout<<s2<<endl;
262 }
263 void test_data()
264 {
265 //const char* data() const;返回指向与字符串相同内容的字符数组的指针。
266 string s1("hello Linux");
267 char*str=new char[s1.size()+1];
268 strcpy(str,s1.data());
269 cout<<str<<endl;
270
271 }
272 void test_find()
273 {
274 //1. size_t find ( const string& str, size_t pos = 0 ) const;
275 string s1("hello world");
276 string s2("world");
277 int len1=以上是关于STL--线性容器 string的主要内容,如果未能解决你的问题,请参考以下文章