我有一个C ++ 03应用程序,其中std::vector<T>类型始终用作临时缓冲区。因此,通常会使用std::vector<T>::resize()来调整它们的大小,以确保它们足够大以在使用前容纳所需的数据。该函数的C ++ 03原型实际上是:
void resize(size_type n, value_type val = value_type());
因此实际上在调用时resize(),通过添加适当数量的拷贝来扩大向量val。但是,通常,我只需要知道它vector足够容纳我所需的数据即可。我不需要将其初始化为任何值。复制构造新值只是浪费时间。
C ++ 11可以解决(我认为):在其规范中,它分为resize()两个重载:
void resize(size_type n); // value initialization
void resize(size_type n, const value_type &val); // initialization via copy
这很符合C ++的哲学:只为您想要的付出。但是,正如我指出的那样,我的应用程序不能使用C ++ 11,因此当我遇到Boost.Container库时就感到很高兴,该库在其文档中指出了对该功能的支持。具体来说,boost::container::vector<T>实际上有三个重载resize():
void resize(size_type n); // value initialization
void resize(size_type n, default_init_t); // default initialization
void resize(size_type n, const value_type &val); // initialization via copy
为了验证我是否了解所有内容,我快速进行了一次测试以验证C ++ 11 std::vector<T>和的行为boost::container::vector<T>:
#include <boost/container/vector.hpp>
#include <iostream>
#include <vector>
using namespace std;
namespace bc = boost::container;
template <typename VecType>
void init_vec(VecType &v)
{
// fill v with values [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
for (size_t i = 0; i < 10; ++i) v.push_back(i);
// chop off the end of v, which now should be [1, 2, 3, 4, 5], but the other 5 values
// should remain in memory
v.resize(5);
}
g++在C ++ 03模式下使用4.8.1进行编译,如下所示:
g++ vectest.cc
./a.out
产生以下输出:
std: 0 1 2 3 4 0 0 0 0 0
boost: 0 1 2 3 4 0 0 0 0 0
boost w/default: 0 1 2 3 4 5 6 7 8 9
这并不奇怪。我希望C ++ 03 std::vector<T>用零初始化最后的5个元素。我什至可以说服自己为什么boost::container::vector<T>要这样做(我会假设它模仿C ++ 03模式下的C ++ 03行为)。当我明确要求默认初始化时,才得到想要的效果。但是,当我以C ++ 11模式重建时,如下所示:
g++ vectest.cc -std=c++11
./a.out
我得到以下结果:
std: 0 1 2 3 4 0 0 0 0 0
boost: 0 1 2 3 4 0 0 0 0 0
boost w/default: 0 1 2 3 4 5 6 7 8 9
一模一样!这导致了我的问题:
在这种情况下,我应该从三个测试中看到相同的结果,这是我的错吗?这似乎表明std::vector<T>接口更改并没有真正起任何作用,因为resize()在前两种情况下,最后一次调用中添加的5个元素仍然用零初始化。
HUWWW
慕村9548890
相关分类