반복기를 사용하여 벡터를 탐색하는 방법은 무엇입니까? (C ++)
목표는 [] 연산자 나 "at"메서드 대신 문자열 벡터의 "n 번째"요소에 액세스하는 것입니다. 내가 이해하는 바에 따르면 반복기를 컨테이너를 탐색하는 데 사용할 수 있지만 이전에는 반복기를 사용한 적이 없으며 읽고있는 내용이 혼란 스럽습니다.
누구든지 이것을 달성하는 방법에 대한 정보를 줄 수 있다면 감사하겠습니다. 감사합니다.
첫 번째 요소와 마지막 요소를 각각 참조하는 반복기를 반환하는 클래스 의 begin
및 end
메서드를 사용해야 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
'Programing' 카테고리의 다른 글
Perl 어레이를 인쇄하는 쉬운 방법? (0) | 2020.08.30 |
---|---|
PHP에서 현재 URL 경로 가져 오기 (0) | 2020.08.30 |
C ++의 문자열에서 특정 문자를 제거하는 방법은 무엇입니까? (0) | 2020.08.30 |
Oracle JDBC ojdbc6 Jar를 Maven 종속성으로 사용 (0) | 2020.08.30 |
조각 수명주기-표시 / 숨기기시 어떤 메서드가 호출됩니까? (0) | 2020.08.30 |