IT Share you

문자열을 반복하고 인덱스 (현재 위치)를 어떻게 알 수 있습니까?

shareyou 2021. 1. 10. 19:23
반응형

문자열을 반복하고 인덱스 (현재 위치)를 어떻게 알 수 있습니까?


종종 문자열 (또는 열거 가능한 객체)을 반복 할 때 현재 값뿐만 아니라 위치 (인덱스)에도 관심이 있습니다. 를 사용하여이를 수행하려면 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

반응형