Использование std :: vector в качестве буфера символов - PullRequest
1 голос
/ 13 апреля 2020

Я хочу использовать std::vector в качестве буфера char[]. Я сделал следующее:

std::vector<char> buffer;
buffer.push_back('2');
buffer.push_back('5');
buffer.push_back('6');
std::cout << buffer.data() << "\n";
buffer.clear();
buffer.push_back('3');
std::cout << buffer.data() << "\n";

Что я получу:

256
356

Что я хочу:

256
3

Я предполагаю, что std::vector::clear() не изменяет основной указатель.

Пожалуйста, предложите мне решение.

Ответы [ 2 ]

2 голосов
/ 13 апреля 2020

Ваш код имеет неопределенное поведение; Вы должны наконец добавить нулевой символ-терминатор '\0' (для использования std::vector<char> в качестве c строкового литерала стиля ). например,

std::vector<char> buffer;
buffer.push_back('2');
buffer.push_back('5');
buffer.push_back('6');
buffer.push_back('\0');
std::cout << buffer.data() << "\n";

buffer.clear();
buffer.push_back('3');
buffer.push_back('\0');
std::cout << buffer.data() << "\n";
2 голосов
/ 13 апреля 2020

Идея в порядке. Проблема не в том, что clear не работает, а в том, что вы неправильно печатаете вектор.

buffer.data() возвращает указатель на данные, другими словами, char*. Когда вы используете std::cout для char*, он ожидает завершенную нулем строку (т. Е. Строку стиля C), но вы этого не даете, поскольку в ваших данных нет нулевого символа, поэтому вы получите непредсказуемые результаты.

Вот некоторый код, который печатает вектор правильно (используя std::copy и std::ostreambuf_iterator)

#include <vector>
#include <iostream>
#include <algorithm>
#include <iterator>

int main()
{
    std::vector<char> buffer;
    buffer.push_back('2');
    buffer.push_back('5');
    buffer.push_back('6');
    std::copy(buffer.begin(), buffer.end(), std::ostreambuf_iterator(std::cout));
    std::cout << std::endl;
    buffer.clear();
    buffer.push_back('3');
    std::copy(buffer.begin(), buffer.end(), std::ostreambuf_iterator(std::cout));
    std::cout << std::endl;
    return 0;
}
...