использование итераторов с середины цикла - PullRequest
0 голосов
/ 09 февраля 2012

у меня есть вектор вектора "mydata".Я хочу перебрать свои данные в отрицательном направлении.итератор должен быть запущен с середины до начала.я хочу использовать следующий способ;

vector<vector<int> >::const_iterator points;
int i, k;

(lets assume k = 10)

for (i=k, points=mydata.begin()+k; i != -1; i--, points--){

     //do stuff
}

это правильный путь для итерации в обратном направлении?(Я использую dev c ++, поэтому нельзя использовать предикаты и некоторые современные команды.) Надеюсь, что ваши предложения помогут это сделать.

Ответы [ 4 ]

4 голосов
/ 09 февраля 2012

Возможное решение с использованием reverse_iterator s vector::rbegin() и vector::rend():

#include <iostream> 
#include <vector> 

int main()
{
    std::vector<int> v;
    for (int i = 0; i < 10; i++)
    {
        v.push_back(i);
    }

    for (std::vector<int>::const_reverse_iterator it = v.rbegin()+(v.size()/2);
         it != v.rend();
         it++)
    {
        std::cout << *it << "\n";
    }

    return 0;
}
2 голосов
/ 09 февраля 2012

Вы можете использовать std :: vector :: const_reverse_iterator. Вот пример того, как выполнить итерацию в обратном направлении вектора, начиная с середины:

#include <iostream>
#include <vector>
int main()
{
    std::vector<int> v;

    for(int i = 0; i< 10; i++)
        v.push_back(i);

    std::vector<int>::const_reverse_iterator it = v.rbegin() + 5;


    for(;it != v.rend(); it++)
    {
        std::cout << *it << std::endl;
    }

    return 0;
}

Выход:

4 
3 
2 
1 
0
0 голосов
/ 09 февраля 2012

Есть примерно два хороших решения.Либо вы просто пишете цикл:

vector<int>::const_iterator i = v.begin() + 4;
do {
  // stuff with *i
while (--i != v.begin());

, либо используете обратные итераторы и стандартные алгоритмы STL:

std::for_each(v.rend()-4, v.rend(), &stuff);
0 голосов
/ 09 февраля 2012

Поскольку это вектор, вам вообще не нужно использовать итератор:

for (int k = 4; k >= 0; k--)
{
    // do something with v[k]
}

Пример:

#include <iostream>
#include <vector>
using namespace std;

int main(int argc, char** argv)
{
    int arr[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 };
    vector<int> v(arr, arr + 10);

    for (int k = 4; k >= 0; k--)
    {
        cout << v[k] << endl;
    }
}

Вывод:

5
4
3
2
1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...