C ++, как скопировать диапазон из вектора с помощью двух итераторов - PullRequest
0 голосов
/ 30 декабря 2010

У меня есть пример кода, который не компилируется:

#include <iostream>
#include <vector>

using std::endl; using std::cin; using std::cout;
using std::vector;


int main()
{
    vector<int> vi, seg;
    vi.push_back(3);
    vi.push_back(4);
    vi.push_back(5);
    vi.push_back(6);
    vi.push_back(7);
    vector<int>::const_iterator ci_start = vi.begin();
    vector<int>::const_iterator ci_actual = vi.begin();
    while (ci_actual != vi.end())
    {   
        seg = vi(ci_start, ci_actual);
        cout << "......" ;
        for (const vector<int>::const_iterator ci = vi.begin();
                                    ci != vi.end(); ++ci)
            cout << *ci << " ";
        cout << endl;

        ++ci_actual;
    }   
}

Я хочу передать возрастающую часть вектора vi (которая займет несколько миллионов элементов) в функцию (не показана). Эти сегменты рассматриваются с начала vi до того момента, когда actual находится в данный момент.
Для этого я объявил seg, который должен был иметь часть vi.

Желаемый результат будет:

3
3 4
3 4 5
3 4 5 6 3 4 5 6 7

Разве seg не должен содержать копию элементов vi, обозначенных итераторами ci_start и ci_actual?

Чтобы передать постоянно увеличивающуюся часть vi функции, на которую я ссылался (отсутствует), можно ли сделать это быстрее, не копируя элементы vi в другой вектор, и просто передать ссылку на сегмент vi

Ответы [ 4 ]

3 голосов
/ 30 декабря 2010
for (const vector<int>::const_iterator ci = vi.begin(); ci != vi.end(); ++ci)

Вы объявляете const const_interator здесь. То есть, когда вы пытаетесь вызвать ++ ci, компилятор будет кричать на вас за попытку изменить постоянную переменную. Это должно исправить эту ошибку компилятора:

for (vector<int>::const_iterator ci = vi.begin(); ci != vi.end(); ++ci)
2 голосов
/ 30 декабря 2010

Если у вас есть ошибка компилятора, пожалуйста, сообщите нам, что это такое. Это выглядит так:

  seg = vi(ci_start, ci_actual);

Должно быть

  vector<int> seg(ci_start, ci_actual);

И удалите объявление seg в верхней части main ().

И ваш цикл for должен использовать seg.begin () / seg.end (), если вы хотите напечатать сегмент

1 голос
/ 31 декабря 2010

Re: ваш следующий вопрос о том, как вызвать вспомогательную функцию, которую вы хотите использовать в поддиапазоне вашего большого вектора ...

Во-первых, этот вопрос стекопотока может быть полезен. Принятый ответ «просто передайте пару итераторов» был именно тем, что я собирался предложить.

Во-вторых, если вы в порядке, используя библиотеки повышения, вам могут пригодиться векторные прокси-библиотеки .

0 голосов
/ 30 декабря 2010
int main()
{
    vector<int> vi;

    vi.push_back(3);
    vi.push_back(4);
    vi.push_back(5);
    vi.push_back(6);
    vi.push_back(7);

    //the end of the sequence 
    vector<int>::iterator seq_end = vi.begin() + 1;

    while (seq_end != vi.end())
    {
        cout << "......" ;
        for (vector<int>::iterator ci = vi.begin(); ci != seq_end; ++ci)
            cout << *ci << " ";
        cout << endl;

        any_function(vi.begin(), seq_end);

        ++seq_end;
    }   
}

void any_function(const vector<int>::iterator& seq_start,
                  const vector<int>::iterator& seq_end)
{
    ...
}

этот код делает его, анализирует и исправляет ваши ошибки.

...