gpt4 book ai didi

c++ - 查找 string_view 开头与其基础字符串之间距离的最佳方法

转载 作者:行者123 更新时间:2023-12-01 14:19:57 27 4
gpt4 key购买 nike

给定一个 std::string sstd::string_view s_view。找到 s_view 开头和 s 之间距离的“最佳”方法是什么?我所说的“最佳”是指什么对所有主要的 C++ 编译器都是安全的?

下面的代码示例说明了我能想到的两个选项。我不确定这两种方法是否总是适用于所有主要编译器。另外,我不禁觉得有一种更“正确”的方法,但我找不到任何 std::stringstd::string_view 实现此目的的方法。

main.cpp

#include <iostream>
#include <string>

int main() {
std::string s{"0123456789"};
std::string_view s_view{s.data() + 3, 4};
std::cout << "Pointer difference: "
<< (s_view.data() - s.data()) << std::endl;
std::cout << "Iterator distance: "
<< std::distance(std::string_view{s}.begin(), s_view.begin())
<< std::endl;
return 0;
}

使用 clang++ main.cpp -std=c++11 在 Apple clang 版本 11.0.0 的 mac 上编译。它打印:

Pointer difference: 3
Iterator distance: 3

最佳答案

std::string_view 没有它正在查看的 std::string 的概念。它所知道的只是给定的起始 char* 数据指针。

比较来自不同容器的迭代器是未定义的行为,即使它们引用相同的底层数据也是如此。

因此,您唯一的选择是比较原始指针,就像您在“Pointer difference” 示例中所做的那样。如果你想比较迭代器,你必须先将它们解引用为指针,例如:

std::cout << "Pointer distance via Iterators: "
<< (&*s_view.begin() - &*s.begin())
<< std::endl;

Live Demo

关于c++ - 查找 string_view 开头与其基础字符串之间距离的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63677341/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com