来自C数组的STL数组没有复制

时间:2017-04-05 16:13:11

标签: c++

有没有办法在STL容器中封装固定大小的C数组? 换句话说,让我说我有一个大小为arrC的C-array size,我想要一个使用arrC的容器(不涉及复制)但实现了通常的函数和迭代器。这是我正在考虑的用例:

int arrC[] = {1,2,3,4,5,6};
auto myarr = c_array(arrC, 6);   // The data is not saved internally here, just the pointer and the size
for (auto itr=myarr.begin();itr!=myarr.end();++itr)
     std::cout << *itr << std::endl;

当然,我知道这可能不安全,因为我可以释放arrC。

编辑:我需要这个的原因是因为我的C ++为其他语言(包括Python)提供了一个C接口,我希望能够处理传递给我的C ++函数的数据,而不必复制它。 / p>

3 个答案:

答案 0 :(得分:6)

  

但实现了通常的功能......

你的意思是std::beginstd::end的数组重载,这使得新式for循环能够自动运行?

  

...和迭代器

原始指针是自动RandomAccessIterators的事实,因为它是如何设计迭代器的?

即现代习语

int a[] = {1, 2, 3, 4, 5, 6};
// demonstrate that the overloads exist ...
auto b = std::begin(a);
auto e = std::end(a);
// and that b,e work correctly as InputIterators ...
std::cout << "distance=" << (std::distance(b, e)) << '\n';
std::cout << "elements=" << (sizeof(a)/sizeof(a[0])) << '\n';
// and further that they're explicitly described as RandomAccessIterators ...
std::cout << "random access="
    << std::is_same<std::iterator_traits<decltype(b)>::iterator_category,
                    std::random_access_iterator_tag>::value << '\n';
// and finally that new-style for just works ...
std::cout << "{";
for (auto i : a) {
    std::cout << i << ',';
}
std::cout << "}\n";

将给出预期的输出:

distance=6
elements=6
random access=1
{1,2,3,4,5,6,}

如果你想写

,那你就不走运了
for (auto i = a.begin(); i != a.end(); ++i)
相反,但你为什么要这样做?

答案 1 :(得分:3)

不,标准库中没有针对该特定任务的任何内容(尽管std::array有点逆转了这种情况:它不会让你绕过现有的数组,但基本上做了保证其存储将是一个简单的数组。)

Guideline Support Library确实包含了一个span类,但实际上就是这个目的。

答案 2 :(得分:2)

为此目的,Visual Studio有一个array_view class

  

表示另一个容器中保存的数据的N维视图。