Итерация по std :: vector <char> - PullRequest
0 голосов
/ 10 марта 2020

У меня есть некоторое устаревшее C, которое перебирает buffer_1, выделенное с некоторой допустимой памятью. buffer_2 указывает на части buffer_1, итерация движется случайным образом на 20 позиций вперед. Ниже приведен код:

char* buffer_1;
char* buffer_2;
size_t buffer_length;

buffer_length = 2000; // somerandom value

if (buffer_length > 0) {
    buffer_1 = malloc(buffer_length);
    for(buffer_2 = buffer_1; buffer_2 < buffer_1 + buffer_length; buffer_2 += 20) {
        // Some random logic
    }
}

Я хочу сделать приведенный выше код C ++ 11 совместимым, объявив buffer_1 и buffer_2 как std::vector<char> s, как показано ниже.

std::vector<char> buffer_1;
std::vector<char> buffer_2;

Тогда я думаю, что мне нужно использовать итератор над buffer_1 сделать что-то вроде ниже?

if (buffer_length > 0) {
    buffer_1.reserve(buffer_length);
    for(std::vector<char>::iterator it = buffer_1.begin(); it != buffer_1.end(); it += 20) {
        buffer_2.data() = *it;
    }
}

Является ли вышеуказанный способ итерации по std::vector<char> правильным? Делает ли он именно то, что делает следующий оператор for?

for(buffer_2 = buffer_1; buffer_2 < buffer_1 + buffer_length; buffer_2 += 20)

1 Ответ

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

Я хочу сделать приведенный выше код совместимым с C ++ 11

Этот код уже действителен C ++ 11.

- вышеуказанный способ итерации через std :: vector правильно? Делает ли он именно то, что делает следующий оператор for?

Нет и нет:

  • Вам нужно использовать resize вместо reserve.
  • Если размер буфера не кратен 20, он не будет работать.
  • И это buffer_2.data() = *it; не имеет смысла, поскольку data() является просто указателем на внутренний буфер.
...