考虑以下代码片段,这是C++ 11编译器完全可以接受的:
#include <array>
#include <iostream>
auto main() -> int {
std::array<double, 0> A;
for(auto i : A) std::cout << i << std::endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
根据标准§23.3.2.8[ 零大小的阵列 ]:
1数组应为特殊情况提供支持N == 0.
2在这种情况下N == 0,begin() == end() ==独特的价值.返回值
data()未指定.
3调用front()或back()零大小数组的效果是未定义的.
4成员函数swap()应具有等效的noexcept-speci fi cationnoexcept(true).
如上所示,零大小的std::arrays在C++ 11中是完全允许的,与零大小的数组(例如int A[0];)相比,它们被明确禁止,但是一些编译器(例如,GCC)允许它们以未定义的行为为代价. .
考虑到这种"矛盾",我有以下问题:
为什么C++委员会决定允许零大小的std::arrays?
有什么有价值的用途吗?
有没有办法将a vector::iterator转换为指针而无法访问向量本身?仅当vector可用时才有效:
typedef vector<int> V;
int* to_pointer1( V& v, V::iterator t )
{
return v.data() + (t-v.begin() );
}
Run Code Online (Sandbox Code Playgroud)
但是如何在没有vector周围的情况下完成这项工作?这不起作用:
int* to_pointer2( V::iterator t )
{
// the obvious approach doesn't work for the end iterator
return &*t;
}
Run Code Online (Sandbox Code Playgroud)
事实上,我本来希望这是一个非常基本和流行的问题,但由于某种原因,我找不到它.
我希望能够使用ostream_iterator流式传输到二进制文件。但是ostream_iterator使用FormattedOuputFunction所以它会写 ASCII,而不是二进制:
std::ostream_iterator是一个单通道 OutputIterator,它使用类型将连续的对象写入构造它T的std::basic_ostream对象中,使用operator<<
除了编写我自己的迭代器之外,还有没有办法使用迭代器来编写二进制文件?
我正在尝试做的一个简化示例,但该copy语句会将 ASCII 写入我的二进制文件:
ofstream foo("foo.txt", ios_base::binary);
vector<int> bar = {13, 42};
copy(bar.cbegin(), bar.cend(), ostream_iterator<decltype(bar)::value_type>(foo));
Run Code Online (Sandbox Code Playgroud)