Programing

반복기를 사용하여 벡터를 탐색하는 방법은 무엇입니까?

crosscheck 2020. 8. 30. 07:42
반응형

반복기를 사용하여 벡터를 탐색하는 방법은 무엇입니까? (C ++)


목표는 [] 연산자 나 "at"메서드 대신 문자열 벡터의 "n 번째"요소에 액세스하는 것입니다. 내가 이해하는 바에 따르면 반복기를 컨테이너를 탐색하는 데 사용할 수 있지만 이전에는 반복기를 사용한 적이 없으며 읽고있는 내용이 혼란 스럽습니다.

누구든지 이것을 달성하는 방법에 대한 정보를 줄 수 있다면 감사하겠습니다. 감사합니다.


첫 번째 요소와 마지막 요소를 각각 참조하는 반복기를 반환하는 클래스 beginend메서드를 사용해야 vector합니다.

using namespace std;  

vector<string> myvector;  // a vector of stings.


// push some strings in the vector.
myvector.push_back("a");
myvector.push_back("b");
myvector.push_back("c");
myvector.push_back("d");


vector<string>::iterator it;  // declare an iterator to a vector of strings
int n = 3;  // nth element to be found.
int i = 0;  // counter.

// now start at from the beginning
// and keep iterating over the element till you find
// nth element...or reach the end of vector.
for(it = myvector.begin(); it != myvector.end(); it++,i++ )    {
    // found nth element..print and break.
    if(i == n) {
        cout<< *it << endl;  // prints d.
        break;
    }
}

// other easier ways of doing the same.
// using operator[]
cout<<myvector[n]<<endl;  // prints d.

// using the at method
cout << myvector.at(n) << endl;  // prints d.

일반적으로 반복기는 선형 방식으로 컨테이너의 요소에 액세스하는 데 사용됩니다. 그러나 "무작위 액세스 반복자"를 사용하면와 동일한 방식으로 모든 요소에 액세스 할 수 있습니다 operator[].

벡터의 임의 요소에 액세스 하려면 vec다음을 사용할 수 있습니다.

vec.begin()                  // 1st
vec.begin()+1                // 2nd
// ...
vec.begin()+(i-1)            // ith
// ...
vec.begin()+(vec.size()-1)   // last

다음은 일반적인 액세스 패턴 의 예입니다 (이전 버전의 C ++).

int sum = 0;
using Iter = std::vector<int>::const_iterator;
for (Iter it = vec.begin(); it!=vec.end(); ++it) {
    sum += *it;
}

반복기 사용의 장점은 다른 컨테이너에 동일한 패턴을 적용 할 수 있다는 것입니다 .

sum = 0;
for (Iter it = lst.begin(); it!=lst.end(); ++it) {
    sum += *it;
}

이러한 이유로 컨테이너 유형에 관계없이 동일하게 작동하는 템플릿 코드를 만드는 것은 정말 쉽습니다 . 반복자의 또 다른 장점은 데이터가 메모리에 상주한다고 가정하지 않는다는 것입니다. 예를 들어 입력 스트림에서 데이터를 읽을 수있는 순방향 반복기를 만들거나 단순히 데이터를 즉석에서 생성 할 수 있습니다 (예 : 범위 또는 난수 생성기).

std::for_each및 람다를 사용하는 또 다른 옵션 :

sum = 0;
std::for_each(vec.begin(), vec.end(), [&sum](int i) { sum += i; });

Since C++11 you can use auto to avoid specifying a very long, complicated type name of the iterator as seen before (or even more complex):

sum = 0;
for (auto it = vec.begin(); it!=vec.end(); ++it) {
    sum += *it;
}

And, in addition, there is a simpler for-each variant:

sum = 0;
for (auto value : vec) {
    sum += value;
}

And finally there is also std::accumulate where you have to be careful whether you are adding integer or floating point numbers.


In C++-11 you can do:

std::vector<int> v = {0, 1, 2, 3, 4, 5};
for (auto i : v)
{
   // access by value, the type of i is int
   std::cout << i << ' ';
}
std::cout << '\n';

See here for variations: https://en.cppreference.com/w/cpp/language/range-for


Vector's iterators are random access iterators which means they look and feel like plain pointers.

You can access the nth element by adding n to the iterator returned from the container's begin() method, or you can use operator [].

std::vector<int> vec(10);
std::Vector<int>::iterator it = vec.begin();

int sixth = *(it + 5);
int third = *(2 + it);
int second = it[1];

Alternatively you can use the advance function which works with all kinds of iterators. (You'd have to consider whether you really want to perform "random access" with non-random-access iterators, since that might be an expensive thing to do.)

std::vector<int> vec(10);
std::vector<int>::iterator it = vec.begin();

std::advance(it, 5);
int sixth = *it;

참고URL : https://stackoverflow.com/questions/2395275/how-to-navigate-through-a-vector-using-iterators-c

반응형