`std :: string`의 하위 문자열에 대한`string_view`를 효율적으로 가져 오는 방법
http://en.cppreference.com/w/cpp/string/basic_string_view 를 참조로 사용하면 이 작업을 더 우아하게 수행 할 방법이 없습니다.
std::string s = "hello world!";
std::string_view v = s;
v = v.substr(6, 5); // "world"
더 나쁜 것은 순진한 접근 방식이 함정이며 v
일시적인 참조를 남깁니다 .
std::string s = "hello world!";
std::string_view v(s.substr(6, 5)); // OOPS!
내가 기억하는 것 보기로 문자열을 반환하는 표준 라이브러리에 추가가있을 수 있습니다 같은 것을 :
auto v(s.substr_view(6, 5));
다음 해결 방법을 생각할 수 있습니다.
std::string_view(s).substr(6, 5);
std::string_view(s.data()+6, 5);
// or even "worse":
std::string_view(s).remove_prefix(6).remove_suffix(1);
솔직히 이것들 중 어느 것도별로 좋지 않다고 생각합니다. 지금 제가 생각할 수있는 가장 좋은 방법은 별칭을 사용하여 간단하게 일을 덜 장황하게 만드는 것입니다.
using sv = std::string_view;
sv(s).substr(6, 5);
자유 기능 경로가 있지만 과부하를 제공하지 않는 std::string
한 뱀 구덩이입니다.
#include <string>
#include <string_view>
std::string_view sub_string(
std::string_view s,
std::size_t p,
std::size_t n = std::string_view::npos)
{
return s.substr(p, n);
}
int main()
{
using namespace std::literals;
auto source = "foobar"s;
// this is fine and elegant...
auto bar = sub_string(source, 3);
// but uh-oh...
bar = sub_string("foobar"s, 3);
}
IMHO string_view의 전체 디자인은 우리를 segfaults와 화난 고객의 세계로 다시 데려다 줄 공포 쇼입니다.
최신 정보:
과부하를 추가하는 것조차도 std::string
공포 쇼입니다. 미묘한 segfault 시한 폭탄을 발견 할 수 있는지 확인하십시오 ...
#include <string>
#include <string_view>
std::string_view sub_string(std::string_view s,
std::size_t p,
std::size_t n = std::string_view::npos)
{
return s.substr(p, n);
}
std::string sub_string(std::string&& s,
std::size_t p,
std::size_t n = std::string::npos)
{
return s.substr(p, n);
}
std::string sub_string(std::string const& s,
std::size_t p,
std::size_t n = std::string::npos)
{
return s.substr(p, n);
}
int main()
{
using namespace std::literals;
auto source = "foobar"s;
auto bar = sub_string(std::string_view(source), 3);
// but uh-oh...
bar = sub_string("foobar"s, 3);
}
컴파일러는 여기서 경고 할 내용을 찾지 못했습니다. 코드 리뷰도 그렇지 않을 것이라고 확신합니다.
나는 전에 그것을 말했고, C ++위원회의 누군가가 지켜보고있는 경우를 대비해서 다시 말할 것입니다. 암시 적 변환을 std::string
to 에서 허용 std::string_view
하는 것은 끔찍한 오류입니다 .
최신 정보
cpporg 게시판에서 string_view의 다소 놀라운 속성을 (나에게) 제기 한 결과, 내 우려는 무관심했습니다.
The consensus of advice from this group is that std::string_view
must never be returned from a function, which means that my first offering above is bad form.
There is of course no compiler help to catch times when this happens by accident (for example through template expansion).
As a result, std::string_view
should be used with the utmost care, because from a memory management point of view it is equivalent to a copyable pointer pointing into the state of another object, which may no longer exist. However, it looks and behaves in all other respects like a value type.
Thus code like this:
auto s = get_something().get_suffix();
Is safe when get_suffix()
returns a std::string
(either by value or reference)
but is UB if get_suffix() is ever refactored to return a std::string_view
.
Which in my humble view means that any user code that stores returned strings using auto
will break if the libraries they are calling are ever refactored to return std::string_view
in place of std::string const&
.
So from now on, at least for me, "almost always auto" will have to become, "almost always auto, except when it's strings".
You can use the conversion operator from std::string to std::string_view:
std::string s = "hello world!";
std::string_view v = std::string_view(s).substr(6, 5);
This is how you can efficiently create a sub-string string_view.
#include <string>
inline
std::string_view substr_view(const std::string &s,size_t from,size_t len) {
if( from>=s.size() ) return {};
return std::string_view(s.data()+from,std::min(s.size()-from,len));
}
#include <iostream>
int main(void) {
std::cout << substr_view("abcd",3,11) << "\n";
std::string s {"0123456789"};
std::cout << substr_view(s,3,2) << "\n";
return 0;
}
'IT박스' 카테고리의 다른 글
Airflow에서 동적 워크 플로를 만드는 적절한 방법 (0) | 2020.11.22 |
---|---|
* .csproj 프로젝트에서 BootstrapperPackage는 무엇을 의미합니까? (0) | 2020.11.22 |
.NET에 RAII가없는 이유는 무엇입니까? (0) | 2020.11.22 |
Mac에서 어떤 사용자가 / usr / local / mysql을 소유해야합니까? (0) | 2020.11.22 |
ASP.NET MVC 3 Razor 성능 (0) | 2020.11.22 |