简体   繁体   English

在集合中使用结构

[英]using struct in sets

I am trying to make a set of sets, what is the correct to method to do that in C++. What i am trying to achieve is something like this我正在尝试制作一组,在 C++ 中正确的方法是什么。我想要实现的是这样的

One = { {"DDD", "Numbers", 0xf, 0xf, 0xf, 0x0,0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 64},{"JJ", "Numbers", 0xf, 0xf, 0xf, 0x0,0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 64},
{"kk", "Numbers", 0xf, 0xf, 0xf, 0x0,0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 64}, {"LL", "Numbers", 0xf, 0xf, 0xf, 0x0,0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 64} };

I tried like this我这样试过

#include <set>
#include <iostream>
#include <algorithm>
#include <cstring>

struct Config
{
    const char* lbl;
    const char* desc;
    std::uint8_t se_2A;
    std::uint8_t se_2B;
    std::uint8_t se_2C;
    std::uint8_t se_2D;
    std::uint8_t se_2E;
    std::uint8_t su_2A;
    std::uint8_t su_2B;
    std::uint8_t su_2C;
    std::uint8_t su_2D;
    std::uint8_t su_2E;
    std::size_t total_size;
};

inline bool operator<(const Config& lhs, const Config& rhs)
{
    return lhs < rhs;
}


int main(){


    Config b1  = {"DDD", "Numbers", 0xf, 0xf, 0xf, 0x0,0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 64};
    Config b2  = {"JJ", "Numbers", 0xf, 0xf, 0xf, 0x0,0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 64};
    Config b3  = {"kk", "Numbers", 0xf, 0xf, 0xf, 0x0,0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 64};
    Config b4  = {"LL", "Numbers", 0xf, 0xf, 0xf, 0x0,0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 64};

    std::set<Config> newConfig;
    std::set<std::set<Config>> One;

    newConfig.insert(b1);
    newConfig.insert(b2);

}

But gives me this error但是给我这个错误

Program received signal SIGSEGV, Segmentation fault.
0x00005555555555b9 in operator< (
    lhs=<error reading variable: Cannot access memory at address 0x7fffff7feff8>, rhs=<error reading variable: Cannot access memory at address 0x7fffff7feff0>)
    at main.cpp:32

Whats the correct to way to do this or fix the error?执行此操作或修复错误的正确方法是什么?

inline bool operator<(const Config& lhs, const Config& rhs) { return lhs < rhs; }

This operator< calls the operator< which calls the operator< which the operator< which the operator< which calls... can you spot the problem?这个operator<调用operator<调用operator< operator< operator<调用...你能发现问题吗? The recursion is infinite and will eventually overflow the stack.递归是无限的,最终会溢出堆栈。

What you're probably intending to do is to compare the members of one side to the members of the other side.您可能打算做的是将一方的成员与另一方的成员进行比较。 That said, it's easier to let the compiler do the work (C++20 or later required):也就是说,让编译器完成工作会更容易(需要 C++20 或更高版本):

struct Config
{
    ... members ...
    friend auto operator<=>(const Config&, const Config&) = default;
};

Another issue that comparing pointers to strings isn't comparing the contents of the string.比较字符串指针的另一个问题是不比较字符串的内容。 It might not cause problems in this trivial example, but "Numbers" in this translation unit doesn't necessarily have the same address as "Numbers" in another translation unit.在这个简单的例子中它可能不会引起问题,但是这个翻译单元中的“Numbers”不一定与另一个翻译单元中的“Numbers”具有相同的地址。 And an automatic array such as char str[] = "Numbers";还有一个自动数组,例如char str[] = "Numbers"; definitely wouldn't have the same address.绝对不会有相同的地址。

To compare the strings by their content, you could use std::string_view instead:要按内容比较字符串,您可以改用 std::string_view :

struct Config
{
    std::string_view lbl;
    std::string_view desc;

The problem with your code is that your function calls operator< function recursively infinitely.您的代码的问题是您的 function 无限递归调用operator< function 。

To fix your issue, you'll have to replace your operator< function with the below code: (as said by @Aconcagua)要解决您的问题,您必须将 operator< function 替换为以下代码:(如@Aconcagua 所说)

inline bool operator<(const Config& lhs, const Config& rhs)
{
    return lhs.lbl < rhs.lbl && 
        lhs.desc < rhs.desc && 
        lhs.se_2A < rhs.se_2A &&
        lhs.se_2B < rhs.se_2B &&
        lhs.se_2C < rhs.se_2C &&
        lhs.se_2D < rhs.se_2D &&
        lhs.se_2E < rhs.se_2E &&
        lhs.su_2A < rhs.su_2A &&
        lhs.su_2B < rhs.su_2B &&
        lhs.su_2C < rhs.su_2C &&
        lhs.su_2D < rhs.su_2D &&
        lhs.su_2E < rhs.su_2E &&
        lhs.total_size < rhs.total_size;
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM