【问题标题】:How to read/write or iterate through a specific range of elements within a std::array?如何读/写或遍历 std::array 中特定范围的元素?
【发布时间】:2018-09-29 02:34:27
【问题描述】:

我想在更大的内存中读/写一些特定范围的内存,基本上我想做这样的事情:

std::array<int, 1024> big_array;
unsigned short int offset = 128;

template<std::size_t SIZE>
void ReadArray(std::array<int, size>&  big_array_with_address_offset)
{
  // ... some code in here 
}

ReadArray(big_array + offset); //--> This doesn't work

我能够为我正在处理的另一个函数(下面的代码)做类似的事情,使用原始指针作为函数参数,但我正试图以现代 C++(11 on wards)的方式来做这件事,因为我需要使用std::array我不想使用原始指针作为函数参数

int FindMinElement(int * array)
{
    // Min element from range: 128 to 384
    return *std::min_element(array, array+256);
}

FindMinElements(big_array.data()+128);

注意1:我能够在函数参数中使用较小的std::array 的唯一方法是使用template&lt;std::size_t SIZE&gt;,否则由于大小不兼容,我会出现编译错误。

注意2:我不想使用std::vector 执行此操作,因为我需要静态内存而不是动态内存。

【问题讨论】:

  • 使用迭代器。它们允许您定义要复制的范围。它们还与std::copy 一起使用,因此您可以使用它将元素从一个数组复制到另一个数组。这几乎是对您之前的一个问题的欺骗:stackoverflow.com/questions/52431819/…
  • std::span(在 C++20 中)可能会有所帮助,否则传递迭代器而不是容器。
  • 如果要传递容器,那么也传递偏移量。

标签: c++ arrays


【解决方案1】:

offset 元素处的数组地址传递给FindMinElement 函数。请参阅下面的示例了解如何操作:

#include<iostream>
#include<array>
#include<algorithm>
using namespace std;

std::array<int, 1024> big_array;
unsigned short int offset = 128;

int FindMinElement(int *array)
{
    // Min element from range: 128 to 384
    return *std::min_element(array, array+256);
}

int main(void)
{  
    int counter = 0;
    for(auto & i : big_array) //populates the array from 0 to 1023
    {
        i = counter++; 
    }       
    cout << "Min element in the range 128 to 384 is: ";
    cout << FindMinElement(big_array.begin() + 128) << endl;
}

输出:

Min element in the range 128 to 384 is: 128

【讨论】:

  • 嗨,谢谢你的回答,但这就是我所做的,我提到我不使用这种方法,因为它使用原始指针,我想使用更现代的 C++ 方法,比如使用迭代器
  • 在这种情况下,您可以使用std::arraybegin() 迭代器。我已经更新了答案以反映这一点。
【解决方案2】:

向数组的开头发送一个迭代器,而不是在数组中发送。

您的 FindMinElement 函数收到一个指针,而不是真正的数组。发送迭代器是最接近的等价物。

【讨论】:

  • 嗨,我知道它正在接收一个指针,这就是我在解释中所说的,我能够使用原始指针实现预期的行为,但我想像第一个原型一样使用数组和迭代器来做到这一点
【解决方案3】:

我终于弄明白了,这就是我想要实现的目标,也是我在没有原始指针的情况下使用迭代器和现代 C++ 的意思,P.W.答案接近我想要达到的目标:

short int FindMinElement(std::array<short int, 1>::iterator it);
{
    // Min element from range: 128 to 384
    return *std::min_element(it, it + 128);
}

int main()
{
    std::array<int, 1024> big_array{{0}}; 
    unsigned short int offset = 128;
    short int minval = 0;

    // Asuming big_array is populated in some other place before calling FindMin..()
    minval = FindMinElement(std::begin(big_array) + offset);
    return 0;
}

我希望能够在不使用原始指针的情况下操作数据,然后解决方案是使用迭代器作为参数而不是指针。

这也解决了我在将较大的 std::array 的引用传递给较小的 std::array 函数参数时遇到的 NOTE1 中提到的编译错误

【讨论】:

    猜你喜欢
    • 2021-01-10
    • 2020-05-14
    • 1970-01-01
    • 1970-01-01
    • 2016-11-06
    • 2017-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多