确定范围内的元素放置在连续内存中

欧普

假设我编写了处理一系列元素的模板函数。

template <typename Iter>
void func(Iter first, Iter last);

在此函数中,我想调用一些希望获得连续缓冲区及其大小的低级c函数。做这些事情的通用方法是将我的范围复制到连续的容器中,然后调用c函数。

template <typename Iter>
void func(Iter first, Iter last)
{
    typedef typename iterator_traits<Iter>::value_type value_type;
    vector<value_type> buf(first, last);
    c_func((void*) buf.data(), buf.size() * sizeof(value_type));
}

但是,如果迭代器已经指向某个连续的内存空间,则会执行额外的复制。

因此,问题是,是否有办法确定迭代器是否指向连续的内存空间,以及是否可以在这种情况下使我的函数专门化。

迪特玛·库尔(DietmarKühl)

目前,还没有直接的方法来确定是否将迭代器用于连续内存。有提议添加迭代器优化(例如参见n3884),但是没有类似的东西,并且无法检测为不同的迭代器添加的属性,您将很难确定此特征。

需要实现者支持的关键问题是未指定迭代器类型的名称。结果,您无法创建适用于所有已知为连续迭代器类型的特征。由于迭代器的类型std::vector<T>std::array<T>可以相同,因此T*我认为您甚至不能创建可移植的专业化版本。

但是,可以做的是在特征中测试迭代器类型是否匹配其值类型的已知迭代器类型之一。例如:

template <typename T, typename It>
struct test_iterator
    : std::integral_constant<bool,
        std::is_same<T*, It>::value
        || std::is_same<typename std::vector<T>::iterator, It>::value
        || std::is_same<std::string::iterator, It>::value
        || std::is_same<std::wstring::iterator, It>::value
        > {
};
template <typename It>
struct is_contiguous
    : std::integral_constant<bool,
           test_iterator<typename std::iterator_traits<It>::value_type,
                         It>::value> {
};

[我没有尝试编译代码,即,它可能散布着小的错字;一般方法应该有效,但是]

要添加,例如,std::array<T, N>您需要某种方式以静态方式确定尺寸。我想那是行不通的。可能还需要测试各种const_iterators。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在基于for循环的范围内具有连续存储的序列中查找元素的位置

来自分类Dev

不连续范围内的EXCEL匹配元素

来自分类Dev

删除范围内的列表中的元素

来自分类Dev

在awk中查找范围内的元素

来自分类Dev

在同一范围内释放函数中的内存

来自分类Dev

不连续范围内的条件格式

来自分类Dev

如果不在范围内,则放置“ nil”

来自分类Dev

查找数组中给定范围内的元素数

来自分类Dev

在Swift中推进范围内的所有元素?

来自分类Dev

在元素周围的范围内替换列表中的值

来自分类Dev

增加特定范围内数组中每个元素的值

来自分类Dev

确定给定范围内的素数

来自分类Dev

如何在Python另一列确定的单独连续范围内计算平均收益?

来自分类Dev

确定谓词是否适用于某个范围内的所有元素,全部元素或全部元素

来自分类Dev

SQL-范围是否在连续范围内

来自分类Dev

无需在VBA中编写宏就可以确定元素在特定范围内是否唯一:是否有公式可以做到这一点?

来自分类Dev

如何在JavaScript中连续检测变量是否在范围内超过2秒

来自分类Dev

范围内所有元素的均等

来自分类Dev

替换排序范围内的元素

来自分类Dev

获取日期范围内的数组元素

来自分类Dev

<th>范围内的CSS样式元素

来自分类Dev

直接移动范围内的元素-javascript

来自分类Dev

获取日期范围内的数组元素

来自分类Dev

替换排序范围内的元素

来自分类Dev

访问D范围内的元素

来自分类Dev

在结构范围内选择元素

来自分类Dev

JQuery hide/slideToggle 范围内的元素

来自分类Dev

筛选哪个元素在 R 的范围内

来自分类Dev

在angularjs中,如何根据范围内的数据确定div的位置

Related 相关文章

热门标签

归档