是否可以恢复“std::span”中元素的实际索引?

Tel*_*ope 2 c++ stdvector c++20 std-span

我有一个带有成员变量的类std::vector。我还有一个成员函数,它采用std::vector由两个size_t参数指定的连续范围,并对其执行一些操作。

class MyClass {
    std::vector<int> objects;

public:

    void func(size_t start_index, size_t end_index); 
}
Run Code Online (Sandbox Code Playgroud)

现在,我想size_t用单个参数替换两个std::span参数,以提高安全性、可读性和可维护性。然而,有一个障碍:在我的函数中,我需要能够恢复原始std::vector. 就像这样,我需要能够找到std::span原始数组中的开始位置。有没有办法做到这一点?如果没有,那么我是否别无选择,只能使用我原来笨重的设计?

objects.begin()(我最初尝试通过从我拥有的参数begin()的迭代器中减去来恢复第一个索引std::span,但这导致了编译错误。)

for*_*818 6

如果您有可用的原始向量,则跨度中第一个元素的向量中的索引为

auto index = (span.data() - vector.data());
Run Code Online (Sandbox Code Playgroud)

objects.begin()(我最初尝试通过从我拥有的参数begin()的迭代器中减去来恢复第一个索引std::span,但这导致了编译错误。)

那是行不通的。您无法减去或获取来自不同容器的两个迭代器之间的差异。data另一方面,它们是指向同一数组的指针,您可以了解它们的差异。

  • 出于教育目的,可能值得添加“std::ptrdiff_t”作为类型,而不是保留“auto”。 (2认同)