c++ - 在循环缓冲区中存储结构数据

标签 c++ pointers boost reference iterator

我需要在循环缓冲区中存储一个字符串和一个整数,然后必须遍历它,搜索(使用 substr)是否存在一个字符串,然后将其与整数一起复制到结果缓冲区中。 我写了下面的概念验证代码,但它在第一次 &res 被复制到 out 后过早终止,我不确定为什么,任何人都可以帮帮我?
这是我目前所拥有的:

#include <iostream>
#include <boost/circular_buffer.hpp>
#include <boost/algorithm/string/predicate.hpp>

#define CB_SZ   4
#define ARR     7

struct cb_dat_t{
    std::string lp;
    int cnf;
};

int buffer_check(cb_dat_t &in, boost::circular_buffer<cb_dat_t> &buff, cb_dat_t *out);
 int main(void)
 {
    int i = 0;
    cb_dat_t in[ARR];
    cb_dat_t out;
    boost::circular_buffer<cb_dat_t> cb(CB_SZ);

    in[0].lp = "ABC";
    in[0].cnf = 78;
    in[1].lp = "ABCDE";
    in[1].cnf = 63;
    in[2].lp = "AB";
    in[2].cnf = 92;
    in[3].lp = "1234";
    in[3].cnf = 85;
    in[4].lp = "23";
    in[4].cnf = 71;
    in[5].lp = "ABC";
    in[5].cnf = 63;
    in[6].lp = "BC";
    in[6].cnf = 71;

    for (i=0; i<ARR; i++) {
    buffer_check(in[i], cb, &out);
    std::cout << "result[" << i << "] " << out.lp << " " << out.cnf << std::endl;
    }
    std::cout << "all done!" <<std::endl;
return 0;
 }

int buffer_check(cb_dat_t &in, boost::circular_buffer<cb_dat_t> &buff, cb_dat_t *out)
{
    cb_dat_t res;

    if (!buff.size()){
        std::cout << "buff.size() " << buff.size() << std::endl;
        buff.push_back(in);
        memcpy(out,&in,sizeof(cb_dat_t));
        return 0;
    }

    boost::circular_buffer<cb_dat_t>::iterator itr = buff.begin();
    while (itr!=buff.end()) {
        if (boost::contains(itr->lp,in.lp)) {
            std::cout << itr->lp << " contains " << in.lp << std::endl;
            memcpy(&res,&itr,sizeof(cb_dat_t));
        } else {
            std::cout << itr->lp << " does not contain " << in.lp <<std::endl;
            memcpy(&res,&in,sizeof(cb_dat_t));
        }
        itr++;
    }
    buff.push_back(in);
    memcpy(out,&res,sizeof(cb_dat_t));
    std::cout << "buff.size() " << buff.size() << std::endl;
    return 0;
}

输出在哪里:

./circular
buff.size() 0
result[0] ABC 78
ABC does not contain ABCDE
buff.size() 2

Command terminated

我不确定为什么 g++ 需要我做 memcpy(&res,&itr,sizeof(cb_dat_t));itr 是已经是指针了,不是吗?当我执行 memcpy(&res,itr,sizeof(cb_dat_t)); 时它会提示。

最佳答案

你根本不应该使用 memcpy。由于 cb_dat_t 不是 POD 类型(在这种情况下,因为它包含一个带有构造函数的成员),您应该使用赋值操作来复制 cb_dat_t 对象。 buffer_check中的四个memcpy调用可以替换为

*out = in;
res = *itr;
res = in;
*out = res;

memcpy 将无法正确处理 std::string。编译器为 cb_dat_t 生成的默认赋值运算符将正确复制结构的所有成员。

关于c++ - 在循环缓冲区中存储结构数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51255597/

相关文章:

c++ - 在 C++ 中包含 header

c++ - 返回指向接口(interface)的指针,但将所有权和生命周期保留给提供者

c - C中指针的地址存储在哪里?

c++ - 移植项目VS2003 -> VS2013错误C2039 serialize is not member of hash_Map

c++ - 在不同进程上运行 Boost 单元测试

c++ - 使用 APR 构建 log4cxx

c++ - Qt延迟处理mousePressEvent

C++ extern const char* 没有按预期工作

c++ - 如何将使用 boost::asio 的 native C++ 静态库导入 CLI/C++ 混合模式应用程序?

c++ - 在构造函数 C++ 标准中修改 const 吗?