gpt4 book ai didi

c++ - 在 C++ 中使用查找函数时遇到问题

转载 作者:行者123 更新时间:2023-11-30 01:19:48 25 4
gpt4 key购买 nike

当我使用 std::find 时,我试图找出代码中的差异。

对于我的测试代码。我制作了一个名为 Test 的 Vector

std::vector<const char*> Test;

为了测试查找函数,我使用 push_back 函数用虚拟数据填充了测试 vector

Test.push_back("F_S");
Test.push_back("FC");
Test.push_back("ID");
Test.push_back("CD");
Test.push_back("CT");
Test.push_back("DS");
Test.push_back("CR");
Test.push_back("5K_2");
Test.push_back("10K_5");
Test.push_back("10K_1");
Test.push_back("10K_2");
Test.push_back("10K_3");
Test.push_back("10K_4");
Test.push_back("10K_5");

我想用find函数做的是通过Test,看看有没有重复的数据。第一次遇到数据时,我会将其保存到一个名为 Unique_Data 的 vector 中。

std::vector<const char*> Unique_Data;

所以对于上面的14个数据点,因为重复了10K_5,所以只有13个会被保存。

我使用的代码是这样的

for(int i = 0; i < Test.size(); i++) 
{
if( Unique_Data.empty())
{
Unique_Data.push_back(Test[i]);
}
else if (std::find(Unique_Data.begin(), Unique_Data.end(), Test[i]) != Unique_Data.end())
{
// Move on to next index
}
else
{
Unique_Data.push_back(Test[i]);
}
}

我遇到的问题是当我使用虚拟数据时。我得到了 Unique_Data 的正确答案。

但是,如果我将实际数据保存到保存在链表中的测试 vector 中。我知道它们都是独一无二的。

代码是这样的

p_curr = List.p_root;
while(p_curr != NULL)
{
// id starts from 0
if(atoi(p_curr->id) == 14) break;
Test.push_back(p_curr->Descriptor);

p_curr = p_curr->p_next;
}

我测试了同样的 14 条数据。它们都是 const char* 类型。但是,当我使用链表数据时。查找功能认为所有数据都是唯一的。

谁能告诉我这是怎么回事?

最佳答案

使用 C 风格的字符串有点棘手,它们只是一个指针,指针是通过标识来比较的。两个字符序列相同但地址不同的C字符串会比较不同。

const char first[] = "Hi";
const char second[] = "Hi";
assert(first == second); // will fail!

这个问题有两种解决方案。最简单的方法是在您的容器中使用 std::string,因为 std::string 将提供值比较。另一种方法是将比较仿函数作为最后一个参数传递给 std::find。但这仍然会留下管理存储在 vector 中的 const char*-s 生命周期的问题。

关于c++ - 在 C++ 中使用查找函数时遇到问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20406353/

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