【问题标题】:Adding new field to a c++ vector向 C++ 向量添加新字段
【发布时间】:2015-11-02 12:11:07
【问题描述】:

我正在开发一个应用程序来发送和接收数据包。

我正在使用std::vector 类(首先我开始在数组中制作数据包,如果您提出更好的建议,我愿意更改方法)。

我发现this 智能函数可以将任何const char* 添加到vector 对象。但我想做另一个在{.. , ..} 之间添加它们,就像我在 C# 中可以做的那样。举个例子:

vector<char*> packet;

char dest[] = { 0x10, 0x10, 0x0, 0x61 };
AppendLiteral(packet, dest); //Ok

/*Or directly:*/ AppendLiteral(packet, { 10, 10, 0, 20 }); //But this does not work

在 c++ 中可以吗?我知道在 C# 中你可以做这样的事情。

编辑:

一个可能的解决方案是:

vector<uint8> telegram;

vector<uint8> src = { 0x10, 0x10, 0x0, 0x20 };
vector<uint8> dst = { 0x10, 0x10, 0x0, 0x60 };

telegram.insert(telegram.end(), dst.begin(), dst.end());
telegram.insert(telegram.end(), src.begin(), src.end());

用一点函数来写less:

template <typename T>
void Append(vector<T> *data, vector<T> *data2)
{
    data->insert(data->end(), data2->begin(), data2->end());
}

【问题讨论】:

  • 你的意思是std::vector
  • 你确定最后一行的数字没有被解析为ints?
  • 我找到了一种方法:使用向量并使用函数insert。我也创建了一个新函数:void Append(vector&lt;T&gt; *data, vector&lt;T&gt; *data2) { data-&gt;insert(data-&gt;end(), data2-&gt;begin(), data2-&gt;end()); }

标签: c++ arrays vector telegram


【解决方案1】:

您的vector&lt;char*&gt; 只包含指向char 类型变量的指针。它不包含任何数据。这是危险的,因为如果指向的对象超出范围,则所述指针可能会悬空。

最好使用数据类型作为vector 的元素类型。如果要存储字符串,请使用std::vector&lt;std::string&gt;。如果要保存 char[4] 之类的对象,请使用 std::vetor&lt;std::array&lt;char,4&gt;&gt;。如果要保存任意长度的字节数组,请使用std::vetor&lt;std::vector&lt;char&gt;&gt;

int main()
{
  using packet=std::array<char,4>; // also works with packet=std::string
                                   //              or packet=std::vector<char>

  std::vector<packet> packets;

  packets.push_back({0x10, 0x10, 0x0, 0x61});
  packets.push_back({10, 10, 0, 20});

  packet p={0x2,0x4,0xa,0xb};
  packets.push_back(p);
}

【讨论】:

  • 我明白了,我会做的。谢谢
  • 我已经尝试过了,但它似乎不起作用。您将如何加入两个 arrais?
  • 您尝试了什么,什么没有奏效?更加详细一些。另外,你不断地改变你的问题——这很糟糕,因为很难击中一个移动的目标。
【解决方案2】:

当然。

std::vector<std::array<char, 4>> packet;

试试这个。

【讨论】:

  • 我不习惯在 c++ 中编写很多代码,所以我将代码复制粘贴到我的程序中,并且 T 出现模棱两可的模板参数错误。我正在添加十六进制值,所以我不知道如果 char 类型是最佳的(在 C# 中我使用字节数组)
  • 我想要的是如果我有这个数组(电报头)[01,00,01,01,00] 我想添加另外两个 [10,01] 例如,我做不知道你知不知道我的意思。
  • 包不只有4个字段,我想每次都加字符串。例如,一开始我是用数组来做的: char src[4] {0x10, 0x10, 0x0, 0x20};字符 dst[4] {0x10, 0x10, 0x0, 0x60};所以后来我把它们放在一个 char[8] 数组中。接下来,例如,我添加了一个包含更多数据的 char[64] 数组。
  • 所以你需要的实际上是 std::string 或 std::vector 作为元素类型。
猜你喜欢
  • 1970-01-01
  • 2020-07-01
  • 2019-07-19
  • 1970-01-01
  • 2022-01-23
  • 2012-10-27
  • 2017-04-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多