相关疑难解决方法(0)

在C++ 11中是否存在零大小的std :: array的原因?

考虑以下代码片段,这是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 cation noexcept(true).

如上所示,零大小的std::arrays在C++ 11中是完全允许的,与零大小的数组(例如int A[0];)相比,它们被明确禁止,但是一些编译器(例如,GCC)允许它们以未定义的行为为代价. .

考虑到这种"矛盾",我有以下问题:

  • 为什么C++委员会决定允许零大小的std::arrays?

  • 有什么有价值的用途吗?

c++ arrays c++11 stdarray c++14

41
推荐指数
1
解决办法
4267
查看次数

将向量迭代器转换为指针

有没有办法将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)

事实上,我本来希望这是一个非常基本和流行的问题,但由于某种原因,我找不到它.

c++

10
推荐指数
2
解决办法
6948
查看次数

用于二进制输出的 ostream_iterator

我希望能够使用ostream_iterator流式传输到二进制文件。但是ostream_iterator使用FormattedOuputFunction所以它会写 ASCII,而不是二进制:

std::ostream_iterator是一个单通道 OutputIterator,它使用类型将连续的对象写入构造它Tstd::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)

c++ file-io iterator fstream binaryfiles

3
推荐指数
2
解决办法
1690
查看次数

标签 统计

c++ ×3

arrays ×1

binaryfiles ×1

c++11 ×1

c++14 ×1

file-io ×1

fstream ×1

iterator ×1

stdarray ×1