문자열을 반복하고 인덱스 (현재 위치)를 어떻게 알 수 있습니까?
종종 문자열 (또는 열거 가능한 객체)을 반복 할 때 현재 값뿐만 아니라 위치 (인덱스)에도 관심이 있습니다. 를 사용하여이를 수행하려면 string::iterator
별도의 인덱스를 유지해야합니다.
string str ("Test string");
string::iterator it;
int index = 0;
for ( it = str.begin() ; it < str.end(); it++ ,index++)
{
cout << index << *it;
}
위에 표시된 스타일은 'c 스타일'보다 우수하지 않습니다.
string str ("Test string");
for ( int i = 0 ; i < str.length(); i++)
{
cout << i << str[i] ;
}
Ruby에서는 콘텐츠와 색인을 모두 우아한 방식으로 얻을 수 있습니다.
"hello".split("").each_with_index {|c, i| puts "#{i} , #{c}" }
그렇다면 열거 가능한 객체를 반복하고 현재 인덱스를 추적하는 C ++의 모범 사례는 무엇입니까?
이 특정 질문에 대한 모범 사례에 대해 들어 본 적이 없습니다. 그러나 일반적으로 한 가지 모범 사례는 문제를 해결하는 가장 간단한 솔루션을 사용하는 것입니다. 이 경우 배열 스타일 액세스 (또는이를 호출하려는 경우 c 스타일)는 인덱스 값을 사용할 수있는 동안 반복하는 가장 간단한 방법입니다. 그래서 나는 확실히 그 방법을 추천 할 것입니다.
이렇게 :
std::string s("Test string");
std::string::iterator it = s.begin();
//Use the iterator...
++it;
//...
std::cout << "index is: " << std::distance(s.begin(), it) << std::endl;
앞서 언급 한대로 표준 STL 기능 거리를 사용할 수 있습니다.
index = std::distance(s.begin(), it);
또한 c와 유사한 인터페이스를 사용하여 문자열 및 기타 컨테이너에 액세스 할 수 있습니다.
for (i=0;i<string1.length();i++) string1[i];
좋은 방법은 가독성을 기반으로합니다. 예 :
string str ("Test string");
for (int index = 0, auto it = str.begin(); it < str.end(); ++it)
cout << index++ << *it;
또는:
string str ("Test string");
for (int index = 0, auto it = str.begin(); it < str.end(); ++it, ++index)
cout << index << *it;
또는 원본 :
string str ("Test string");
int index = 0;
for (auto it = str.begin() ; it < str.end(); ++it, ++index)
cout << index << *it;
등등. 당신에게 가장 쉽고 깨끗한 것이 무엇이든.
어딘가에 카운터 변수가 필요하기 때문에 모범 사례가 하나도 있는지 확실하지 않습니다. 질문은 당신이 그것을 정의하는 곳과 그것이 당신에게 잘 맞는지 여부입니다.
I would use it-str.begin() In this particular case std::distance and operator- are the same. But if container will change to something without random access, std::distance will increment first argument until it reach second, giving thus linear time and operator- will not compile. Personally I prefer the second behaviour - it's better to be notified when you algorithm from O(n) became O(n^2)...
Since std::distance
is only constant time for random-access iterators, I would probably prefer explicit iterator arithmetic. Also, since we're writing C++ code here, I do believe a more C++ idiomatic solution is preferable over a C-style approach.
string str{"Test string"};
auto begin = str.begin();
for (auto it = str.begin(), end = str.end(); it != end; ++it)
{
cout << it - begin << *it;
}
For strings, you can use string.c_str()
which will return you a const char*, which can be treated as an array, example:
const char* strdata = str.c_str();
for (int i = 0; i < str.length(); ++i)
cout << i << strdata[i];
ReferenceURL : https://stackoverflow.com/questions/1315041/how-can-i-iterate-through-a-string-and-also-know-the-index-current-position
'IT Share you' 카테고리의 다른 글
C # 키워드를 속성 이름으로 어떻게 사용합니까? (0) | 2021.01.10 |
---|---|
Spring-Annotation Based Controller-쿼리 문자열 기반 RequestMapping (0) | 2021.01.10 |
Objective-C 101 (유지 vs 할당) NSString (0) | 2021.01.10 |
ListView에서 부모로 스크롤 이벤트 버블 링 (0) | 2021.01.10 |
Bash에서 날짜 구문 분석 (0) | 2021.01.10 |