分享
 
 
 

STL(shipped with VC6) Questions & Answers(四)

王朝vc·作者佚名  2006-01-08
窄屏简体版  字體: |||超大  

VC.STL Newsgroup Good Questions(四)

Article last modified on 2002-5-30

----------------------------------------------------------------

The information in this article applies to:

- Microsoft Visual C++, 32-bit Editions, version 6.0, SP5

----------------------------------------------------------------

今天提供四个问题。

一.How does STL Map treat pointers?

Question:

STL的Map是如何处理指针的?

比如,我们将一个char*作为key,STL会主动释放它吗?或者这么说,我想确定,当一个item被删除时,我的char*没有被删除。是否Map另外复制了一份char*?

Answer:

是的,Keys和Values都会被复制一份,然后传入(所有的容器都是这样做的)。容器仅仅负责删除这份copy。

所以当你把一个指针放到Map中时,Map不关心这个指针引用的是什么。Map得到并最终删除这个指针的copy。

下面的这个问题可能属于初学者容易犯的错误。不妨看一看吧。

二.Error in Put char* array into queue

Question:

我有这样的代码,是将char*一个一个地放入queue中,然后再将它们弹出来,并打印出来。

void main()

{

typedef queue<char*> CHARQUEUE;

CHARQUEUE q;

char s[10];

for (int i=65;i<81;i++)

{

_strnset(s,i,9);

s[9]='\0';

q.push(s);

}

for (i=61;i<84;i++) {

q.pop();

if(q.size())

cout << q.front()<< endl;

}

}

但是结果不对,为什么?打印出来的各个元素都是”PPPPPPPPP”?

Answer:

原因就是每次循环是都重写了静态分配的字符串数组。你应该使用basic_string,它将为你分配和管理字符串资源,而不是自己手工填充这些Buffers。

修改你的代码如下,也可以(要注意释放malloc出来的东西):

for (int i=65;i<81;i++)

{

char* s = (char*)malloc(10);

_strnset(s,i,9);

s[9]='\0';

q.push(s);

}

剩下的两个问题,都挺简单的,属于HowToDo的问题。第一个:

三.如何用一句话让vector<char*>读写文件?

Question:

我有一个char* vector,如何用一句话将其内容写至一个文件中,或者从文件读至vector,而不是Element By Element地做?

Answer:

假设你想一个vector的元素为文件的一行。那么我们可以这么做:

#include <string>

#include <vector>

#include <iterator>

#include <fstream>

using namespace std;

void main()

{

int VECTOR_SIZE = 10;

vector<char*> vecStrings;

for (int i = 0; i < VECTOR_SIZE; i++)

vecStrings.push_back("Vector Element to File");

ofstream output_file("output_file.txt");

copy(vecStrings.begin(),

vecStrings.end(),

ostream_iterator<char*>(output_file, "\n"));

}

这样,就产生了一个output_file.txt,其内容为:

Vector Element to File

Vector Element to File

。。。

但是,将内容读回来可能有点复杂。Vector<char*>是问题之所在。STL不知道该如何给它分配空间。

如果是vector<string>的话,倒是可以这么做:

copy(istream_iterator<string>(in_file),

istream_iterator<string>(),

back_inserter(vecStrings));

第二个:

四.如何将list中的某个元素上移一位?

Question:

我有一个list,它有10个元素。我想将第6个元素上移至第5位。有什么简单方法可以做的吗?

Answer:

两种方法。

方法一:

使用list::splice。splice的意思就是将当前的元素从源list中去除,然后放到目标list的指定位置。

下面的代码将把list最后一个元素提至最前面,其他元素就会相应后移一位。

#pragma warning(disable : 4786)

#include <iterator>

#include <list>

#include <string>

#include <iostream>

#include <fstream>

using namespace std;

void main()

{

list<string> _StringList;

_StringList.push_back(string("Begin! "));

_StringList.push_back(string("AfterBegin "));

_StringList.push_back(string("Body "));

_StringList.push_back(string("BeforeEnd "));

_StringList.push_back(string("End! "));

list<string>::iterator itPoint = _StringList.begin();

for(;itPoint!=_StringList.end();itPoint++)

cout << (*itPoint).c_str() << " ";

list<string>::iterator itSwapIndex = _StringList.begin();

list<string>::iterator itelementBelow = _StringList.end();

itelementBelow--;

_StringList.splice(itSwapIndex, _StringList, itelementBelow);

itPoint = _StringList.begin();

for(;itPoint!=_StringList.end();itPoint++)

cout << (*itPoint).c_str() << " ";

}

方法二:

使用iter_swap function。它将交换iterator所指向的元素。很简单,而且可能更通用一点。

list<string>::iterator itSwapIndex = _StringList.begin();

list<string>::iterator itelementBelow = _StringList.end();

itelementBelow--;

iter_swap(itelementBelow, itSwapIndex);

(To be Continued)

Written by zhengyun@tomosoft.com

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有