问题描述
给出一个std::string s
和std::string_view s_view
。找到s_view
的起点和s
之间的距离的“最佳”方法是什么? “最好”是指什么对所有主要的C ++编译器都可以安全地起作用?
下面的代码示例说明了我可以想到的两个选项。我不确定这两种方式是否会在所有主要编译器上正常工作。另外,我不禁感到有一种更“合适”的方式来做,但是我找不到能实现此目标的任何std::string
或std::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;