gpt4 book ai didi

c++ - std::vector 覆盖最终值,而不是增长?

转载 作者:太空宇宙 更新时间:2023-11-04 15:54:17 27 4
gpt4 key购买 nike

我遇到一个问题,使用 vector.push_back(value) 会覆盖最终值,而不是附加到末尾。为什么会发生这种情况?我在 vector 中有一个样本项,所以它的大小永远不会达到零。下面是代码..

void UpdateTable(vector<MyStruct> *Individuals, MyStruct entry)
{
MyStruct someEntry;
bool isNewEntry = true;

for (int i = 0; i < Individuals->size(); i++)
{
if (!(strcmp(Individuals->at(i).sourceAddress, entry.sourceAddress)))
{
isNewEntry = false;
//snip. some work done here.
}
}

if(isNewEntry)
{
Individuals->push_back(entry);
}
}

这让我的第一个“示例”值保留下来,并且只允许在 vector 中再添加一个项目。当添加 2 个新条目时,第二个会覆盖第一个,因此大小永远不会大于 2。

编辑:更多代码,因为这显然不是问题所在?

void *TableManagement(void *arg)
{
//NDP table to store discovered devices.
//Filled with a row of sample data.
vector<MyStruct> discoveryTable;
MyStruct sample;
sample.sourceAddress = "Sample";
sample.lastSeen = -1;
sample.beaconReceived = 1;
discoveryTable.push_back(sample);

srand(time(NULL));
while(1)
{
int sleepTime = rand() % 3;
sleep(sleepTime);
MyStruct newDiscovery = ReceivedValue();
if (newDiscovery.lastSeen != -1000) //no new value from receivedValue()
{
UpdateTable(&discoveryTable, newDiscovery);
}
printTable(&discoveryTable);
}
return NULL;
}

最佳答案

我要冒险猜测一下:

假设 MyStruct 声明如下

struct MyStruct
{
const char *sourceAddress;
// Other Gubbins ...
};

ReceivedValue 做类似的事情

MyStruct ReceivedValue()
{
static char nameBuffer[MAX_NAME_LEN];

// Do some work to get the value, put the name in the buffer

MyStruct s;
s.sourceAddress = nameBuffer;
// Fill out the rest of MyStruct
return s;
}

现在,您插入 vector 的每个结构都有指向同一个全局缓冲区的 sourceAddress,每次调用 ReceivedValue 时,它都会用新字符串覆盖该缓冲区 - 所以 vector 中的每个条目都以相同的字符串结尾。

如果没有看到您的其余代码,我无法确定,但我可以肯定,如果您在问题的评论中遵循一些良好的 C++ 风格建议,这种可能性就会消失。

编辑澄清:不需要堆分配你的结构,只需将 sourceAddress 声明为 std::string 就足以消除这种可能性。

关于c++ - std::vector 覆盖最终值,而不是增长?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2179065/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com