• 软件测试技术
  • 软件测试博客
  • 软件测试视频
  • 开源软件测试技术
  • 软件测试论坛
  • 软件测试沙龙
  • 软件测试资料下载
  • 软件测试杂志
  • 软件测试人才招聘
    暂时没有公告

字号: | 推荐给好友 上一篇 | 下一篇

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

发布: 2007-7-01 20:40 | 作者: admin | 来源: | 查看: 13次 | 进入软件测试论坛讨论

领测软件测试网

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));

 

 

文章来源于领测软件测试网 https://www.ltesting.net/


关于领测软件测试网 | 领测软件测试网合作伙伴 | 广告服务 | 投稿指南 | 联系我们 | 网站地图 | 友情链接
版权所有(C) 2003-2010 TestAge(领测软件测试网)|领测国际科技(北京)有限公司|软件测试工程师培训网 All Rights Reserved
北京市海淀区中关村南大街9号北京理工科技大厦1402室 京ICP备10010545号-5
技术支持和业务联系:info@testage.com.cn 电话:010-51297073

软件测试 | 领测国际ISTQBISTQB官网TMMiTMMi认证国际软件测试工程师认证领测软件测试网