如何在&#34; std :: vector <char>&#34;中找到单个单词容器</焦炭>

时间:2014-01-08 14:54:20

标签: c++ search vector stl find

我有一个混合二进制文件(即图像)和一些存储在“std::vector<char>”容器中的人类可读数据(即HTTP标头)。 (数据由“CRLFCRLF(\ r \ n \ r \ n)”指示符分隔

有人可以建议如何在“std::vector<char>”容器中找到“ \ r \ n \ r \ n ”的开始位置?

是否可以使用“std::size_t pos = data.find("\r\n\r\n");(数据为”std::vector<char>“)”使用STL库?

感谢。

3 个答案:

答案 0 :(得分:5)

您无需将正在寻找的模式放入容器中。一个C字符串就足够了。

std::vector<char> v = ....;
const char *crlf2 = "\r\n\r\n";
auto it = std::search(v.begin(), v.end(), crlf2, crlf2 + strlen(crlf2));

无论如何,在此之后,it将在该模式开始的向量v中包含一个迭代器(如果未找到该模式,则为v.end())。

您可以将其转换为std::distance(v.begin(), it)it - v.begin()

的索引

答案 1 :(得分:4)

您可以使用std::search搜索首次出现的感兴趣的字符序列。您必须将该序列放在数组或容器中。

std::vector<char> v = ....;
std::vector<char> start{'\r', '\n', '\r', '\n'};
auto it = std::search(v.begin(), v.end(), start.begin(), start.end());

答案 2 :(得分:0)

// As mentioned, you can use a basic C-style string.
// But, for convenience, an array works just as well
// Using an array allows for us to use std::begin() and std::end()
static constexpr const char DOUBLE_CLRF[]{'\r','\n','\r','\n'};

/**
 <summary>        Finds the first occurrence of "\r\n\r\n".   </summary>
 <param name="v"> Contains the char data you want to process. </param>
 <returns>        The position of the first "\r\n\r\n".       </returns>
 */
ptrdiff_t findFirstDoubleClrf(const std::vector<char>& v) {
    const auto it = std::search(v.begin(), v.end(), std::begin(DOUBLE_CLRF), std::end(DOUBLE_CLRF));
    return std::distance(v.begin(), it);
}

/**
 <summary>        Finds the last occurrence of "\r\n\r\n".    </summary>
 <param name="v"> Contains the char data you want to process. </param>
 <returns>        The position of the last "\r\n\r\n".        </returns>
 */
ptrdiff_t findLastDoubleClrf(const std::vector<char>& v) {
    const auto it = std::find_end(v.begin(), v.end(), std::begin(DOUBLE_CLRF), std::end(DOUBLE_CLRF));
    return std::distance(v.begin(), it);
}

现在,假设您的std::vector<char>名为data的二进制数据位于您的// To get the *first* match auto pos = findFirstDoubleClrf(data); // To get the *last* match auto lastPos = findLastDoubleClrf(data); // Note: std::distance returns a signed value rather than unsigned (e.g. size_t) // You can, of course, static_cast<size_t>(pos) if desired. 中。

find()

但是但是,如果您错过了std::string提供的std::string_view方法,并且可以使用C ++ 17,则可以使用std::vector<char>而无需复制整个std::string_view sv(&data[0], data.size()); auto pos = sv.find("\r\n\r\n"); auto lastPos = sv.rfind("\r\n\r\n"); 提供类似的功能。

()