首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

vector<string>和vector<string*>的区别?上面程序答案有几步看不懂请大牛解释上

2012-11-16 
vectorstring和vectorstring*的区别?下面程序答案有几步看不懂请大牛解释下?#include iostream#incl

vector<string>和vector<string*>的区别?下面程序答案有几步看不懂请大牛解释下?
#include <iostream>
#include <string>
#include <vector>
using namespace std;

int main(int argc, char *argv[])
{

vector<string*> spvec;
// 读取vector对象
string str;

cout << "Enter some strings (Ctrl + Z to end)" << endl;
while (cin >> str) {
string *pstr = new string;//????
  *pstr = str; //????
spvec.push_back(pstr);
}
//输出每个string的内容及其相应的长度
vector<string*>::iterator iter = spvec.begin();

while (iter != spvec.end()) {
cout << *(*iter)<< (*iter)->size() << endl;//????
++iter;
}
//释放各个动态分配的string对象
iter = spvec.begin();
while (iter != spvec.end()) {
delete *iter;//??????
++iter;
}
system("pause");
return 0;


return 0;
}

[解决办法]
一个存指针,一个存对象,指针拷贝和对象拷贝性能差很多.
[解决办法]
string *pstr = new string;//???? new 一個對象,基本語法
*pstr = str; //????
改變內容


cout << *(*iter)<< (*iter)->size() << endl;//???? 取出字符串

delete *iter;//?????? 手動刪除,由於push_back的是一個new string,vector自帶的解函數無法自動刪除。

[解决办法]
string *pstr = new string;//创建一个新的string空对象
*pstr = str; //把刚才创建的string赋值为str的值
cout << *(*iter)<< (*iter)->size() << endl;//*iter为string*类型,再进行一次*运算获得string
delete *iter;//释放之前创建的string对象

因为push_back是值传递,这样的写法可以避免push_back时的拷贝构造,但是增加了new和delete的过程,实际上并没有什么好处,反而更难理解
如果不用指针,是这样的写法

#include <iostream>
#include <string>
#include <vector>
using namespace std;

int main(int argc, char *argv[])
{

 vector<string> svec;
 // 读取vector对象
 string str;

 cout << "Enter some strings (Ctrl + Z to end)" << endl;
 while (cin >> str) {
 spvec.push_back(str);
 }
 //输出每个string的内容及其相应的长度
 vector<string>::iterator iter = svec.begin();

 while (iter != svec.end()) {
 cout << *iter<< iter->size() << endl;
 ++iter;
 }
 system("pause");
 return 0;


 return 0;
}
[解决办法]
string *pstr = new string;
*pstr = str;

拷贝构造的消耗比起这个来还是不如吧,一次构造一次赋值
[解决办法]

探讨

为什么删除的不是 delete *pstr啊??还有vector<string*>相当几级指针啊?

热点排行