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

问题描述

给出一个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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...