题:
介绍一下STL和包容器,如何实现?举例实现vector。【美国某著名移动通信企业面试题】
答案:
C++的一个新特性就是采用了标准模版库(STL)。所有主要编译器销售商现在都把标准模板库作为编译器的一部分进行提供。标准模板库是一个基于模版的容器类,包括链表、列表、队列和堆栈。标准模版库还包含许多常用的算法,包括排序和查找。
标准模板库的目的是提供对常用需求重新开发的一种替代方法。标准模板库已经经过测试和调试,具有很高的性能并且是免费的。最重要的是,标准模板库是可重用的。当你知道如何使用一个标准模板库的容器后,就可以在所有的程序中使用它而不需要重新开发了。
容器是包含其他对象的对象。标准C++库提供了一系列的容器类,它们都是强有力的工具,可以帮助C++开发人员处理一些常见的编程任务。标准模板库容器类有两种类型,分别为顺序和关联。顺序容器可以提供对其成员的顺序访问和随机访问。关联容器则经过优化关键值访问它们的元素。标准模板库在不同操作系统间是可移植的。所有标准模版库容器类都在namespace std中定义。
举例实现vector如下:
// P94_example1.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <iostream>
#include <vector>
void print(std::vector<int>);
int _tmain(int argc, _TCHAR* argv[])
{
std::vector<int> vec; //定义一个空的容器
print(vec);
vec.push_back(34); //添加一个成员
vec.push_back(23); //添加一个成员
print(vec);
std::vector<int>::iterator p; //定义一个空的迭代器
p = vec.begin(); //指向容器的第一个成员
*p = 68; //修改第一个成员的值
*(p+1) = 69; //修改第二个成员的值
print(vec);
vec.pop_back(); //删除最后一个元素
print(vec);
vec.push_back(101); //添加一个成员
vec.push_back(102); //添加一个成员
print(vec);
vec[0] = 1000; //修改第一个成员的值
vec[1] = 1001; //修改第二个成员的值
vec[2] = 1002; //修改第三个成员的值
print(vec);
return 0;
}
void print(std::vector<int> v)
{
std::cout<<"vector size is: "<<v.size()<<std::endl; //输出向量的大小
//输出容器
int i = 0;
while(i < v.size())
std::cout<<v[i++]<<" ";
std::cout<<std::endl<<std::endl;
//std::vector<int>::iterator p = v.begin();
}
或者是:
// P94_example1'.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <iostream>
#include <vector>
int sum(std::vector<int> vec)
{
int result = 0;
std::vector<int>::iterator p = vec.begin();
while(p != vec.end())
{
result += *p;
p++;
}
return result;
}
int _tmain(int argc, _TCHAR* argv[])
{
std::vector<int> v1(100);
std::cout<<v1.size()<<std::endl; //100
std::cout<<sum(v1)<<std::endl; //0
v1.push_back(23);
std::cout<<v1.size()<<std::endl; //101
std::cout<<sum(v1)<<std::endl; //23
v1.reserve(1000); //增加容器容量
std::cout<<v1.size()<<std::endl;
//v1[900] = 900;
//std::cout<<v1[900]<<std::endl;
std::cout<<v1.front()<<std::endl;
std::cout<<v1.back()<<std::endl;
v1.pop_back();
std::cout<<v1.back()<<std::endl;
return 0;
}