Может ли вектор :: итератор также функционировать как вектор - PullRequest
1 голос
/ 12 марта 2020

Итак, я пытаюсь загрузить бинарный файл в вектор, чтобы я мог использовать его как буфер.

ifstream binaryFile;
vector<unsigned char> fileBuffer(istreambuf_iterator<char>(binaryFile), {});
vector<unsigned char>::iterator fileIter = fileBuffer.begin();

Теперь мой вопрос: если я использую переменную fileIter, могу ли я получить доступ ко всем элементам вектора fileBuffer?
Я хочу знать, потому что мне нужно отредактировать содержимое fileBuffer только в определенных позициях, поэтому я работаю с итераторами в первую очередь.

Упрощенно, я хочу знать, могу ли я редактировать элементы в векторе fileBuffer, если я редактирую fileIter с кодом, подобным *(fileIter + 2) = 'a';

Я исследовал эту топи c но я пока не нашел ответа.

1 Ответ

1 голос
/ 12 марта 2020

Стандартный шаблон класса std :: vector имеет итератор произвольного доступа. Таким образом, вы можете использовать его так же, как указатель. Например,

fileIter[10] = 'A';

или

fileIter += 10;

и т. Д.

Вот демонстрационная программа.

#include <iostream>
#include <vector>

int main() 
{
    std::vector<int> v = { 1, 2, 3, 4, 5 };

    for ( const auto &item : v ) std::cout << item << ' ';
    std::cout << '\n';

    auto it = v.begin();

    it[1] = -it[1];

    for ( const auto &item : v ) std::cout << item << ' ';
    std::cout << '\n';

    it += 2;

    *it *= 10;

    for ( const auto &item : v ) std::cout << item << ' ';
    std::cout << '\n';

    return 0;
}

Ее вывод

1 2 3 4 5 
1 -2 3 4 5 
1 -2 30 4 5 
...