gpt4 book ai didi

c++ - 检查 vector 中具有特定条件的唯一元素

转载 作者:行者123 更新时间:2023-11-28 04:47:56 26 4
gpt4 key购买 nike

我有一个 dataItems 结构的 vector ,我需要在其中检查唯一元素,条件“id”应该不同,即使所有元素(a、b、c)都可以相同,那么它是唯一的。每次将元素添加到 vector 后,我都需要根据 id 检查唯一性(意味着除了“id”之外,所有其他参数都可以相同,然后返回 true 否则返回 false)。

#include <iostream>
#include <vector>

struct dataItems
{
int a, b, c;
unsigned int id;
};

bool isDataUnique(std::vector<dataItems> &dataList)
{
bool ret = true;
for(size_t i = 0; i < dataList.size(); ++i)
{
for(size_t j = 0; j < dataList.size(); ++j)
{
if(i != j)
{
if((dataList.at(i).a == dataList.at(j).a) &&
(dataList.at(i).b == dataList.at(j).b) &&
(dataList.at(i).a == dataList.at(j).a))
{
if(dataList.at(i).id == dataList.at(j).id)
{
ret = false;
break;
}
}
}
}
}
return ret;
}

int main()
{
std::vector<dataItems> v;
dataItems obj1 = {0}, obj2 = {0};

obj1.a = obj2.a = 2;
obj1.b = obj2.b = 3;
obj1.c = obj2.c = 4;
//obj1.id = obj2.id = 1; // data is not unique
obj1.id = 1;
obj2.id = 2; // as id's are different data is unique

v.push_back(obj1);
v.push_back(obj2);

std::cout << std::boolalpha << isDataUnique(v) << '\n';


return 0;
}

在 c++14 中,是否可以优化,因为我觉得我的算法没有优化?

最佳答案

你可能会让自己变得比需要的更难。你有一个结构,你需要创建一个结构的集合,唯一的约束是每条记录都有一个唯一的 ID。其余值可能相同也可能不同,并且出于逻辑目的与您的代码无关。

在声明您的结构(并创建一个方便的typedef)之后,创建一个结构或类来保存和管理您的数据集合是有意义的。

如果使用类,您可以简单地声明一个私有(private) vector 来保存您的数据集合,以及一个私有(private)成员函数来检查添加的任何数据是否包含唯一 ID。例如,您可以声明您的类和结构 vector 类似于:

class items_t {
std::vector<dataitems_t> data;
bool unique (dataitems_t d) {
for (auto& i : data)
if (i.id == d.id)
return false;
return true;
}
public:
...

这里的 unique 函数会在保存建议的新数据的结构成为数据集合的一部分之前检查 ID 是否是唯一的。您可以在 adddata 成员函数中使用它来检查唯一性。例如,如果你想提示输入数据,你可以执行如下操作:

    void adddata() {
dataitems_t tmp;
std::cout << "enter unique ID for data: ";
std::cin >> tmp.id;
if (!unique (tmp)) {
std::cerr << "error: ID (" << tmp.id << ") is not unique.\n";
}
else {
std::cout << "enter the values for a, b & c: ";
std::cin >> tmp.a >> tmp.b >> tmp.c;
data.push_back (tmp);
}
}

如果您希望能够在没有用户交互的情况下提交记录以供收录,您可以执行以下操作:

    void adddata(unsigned id, int a, int b, int c) {
dataitems_t tmp = { a, b, c, id };
if (!unique (tmp)) {
std::cerr << "error: ID(" << tmp.id << ") is not unique.\n";
}
else
data.push_back (tmp);
}

这将确保只有具有唯一 ID 的数据才能成为您的集合的一部分。你可以把它和一个简短的测试程序放在一起,类似于:

#include <iostream>
#include <iomanip>
#include <vector>

typedef struct dataItems {
int a, b, c;
unsigned int id;
} dataitems_t;

class items_t {
std::vector<dataitems_t> data;
bool unique (dataitems_t d) {
for (auto& i : data)
if (i.id == d.id)
return false;
return true;
}
public:
void adddata() {
dataitems_t tmp;
std::cout << "enter unique ID for data: ";
std::cin >> tmp.id;
if (!unique (tmp)) {
std::cerr << "error: ID (" << tmp.id << ") is not unique.\n";
}
else {
std::cout << "enter the values for a, b & c: ";
std::cin >> tmp.a >> tmp.b >> tmp.c;
data.push_back (tmp);
}
}
void adddata(unsigned id, int a, int b, int c) {
dataitems_t tmp = { a, b, c, id };
if (!unique (tmp)) {
std::cerr << "error: ID(" << tmp.id << ") is not unique.\n";
}
else
data.push_back (tmp);
}
void prndata() {
std::cout << "\n" << std::setw(8) << std::left << "ID" <<
std::setw(8) << std::right << "A" <<
std::setw(8) << std::right << "B" <<
std::setw(8) << std::right << "C\n\n";
for (auto& i : data)
std::cout << std::setw(8) << std::left << i.id <<
std::setw(8) << std::right << i.a <<
std::setw(8) << std::right << i.b <<
std::setw(8) << std::right << i.c << "\n";
}
};

int main (void) {

items_t items;

items.adddata (0, 20, 23, 41);
items.adddata (1, 20, 31, 99);
items.adddata (2, 30, 49, 58);
items.adddata (3, 1, 27, 18);
items.adddata ();

items.prndata();

}

示例使用/输出

$ ./bin/vector_data_unique_id
enter unique ID for data: 22
enter the values for a, b & c: 23 06 90

ID A B C

0 20 23 41
1 20 31 99
2 30 49 58
3 1 27 18
22 23 6 90

现在是输入非唯一 ID 的示例:

$ ./bin/vector_data_unique_id
enter unique ID for data: 3
error: ID (3) is not unique.

ID A B C

0 20 23 41
1 20 31 99
2 30 49 58
3 1 27 18

由于 ID 不是唯一的,因此无需提示进一步的 a、b、c 值,因为该数据已被立即丢弃。

检查一下,如果您有任何其他问题,请告诉我。

关于c++ - 检查 vector 中具有特定条件的唯一元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48879861/

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