比较 C++ 中的字符串*

Comparing string* in C++

提问人:温泽海 提问时间:9/27/2022 最后编辑:温泽海 更新时间:9/27/2022 访问量:58

问:

让 和 被赋予正整数。请考虑以下 C++17 代码:ab

string* first;
first = new string[a];
//some definitions

string* second;
second = new string[b];
//some definitions

通过说字符串是未定义的,我的意思是在上面给出的创建代码之后从未对字符串进行任何定义。first[i]first[i]

如果出现以下情况,我定义 和 是相等的:firstsecond

  1. a==b.
  2. first[i]并且等价于每个非负整数,在以下意义上:如果未定义,则 ;if has length(其中 是非负整数),则 has length,并且与每个非负整数的 char 相同。second[i]i<afirst[i]second[i]first[i]llsecond[i]lfirst[i][j]second[i][j]j<l

简而言之,我想要最普通的字符串相等,强调比较内容而不是指针。在 C++17 中执行此操作的最合适方法是什么?我尝试了多个答案,但没有一个有效。

C++ 数组字符串 C++17 比较

评论

0赞 Sam Varshavchik 9/27/2022
“ is null” 是什么意思?.s 不能是“null”,在 C++ 中使用的任何意义上。first[i]std::string
0赞 温泽海 9/27/2022
我修改了这句话,使其更准确。我的意思是未定义。
0赞 Sam Varshavchik 9/27/2022
“ is undefined” 是什么意思?这在C++中也没有任何意义。在 C++ 中,字符串不能为“null”或“undefined”。first[i]
0赞 温泽海 9/27/2022
我已经添加了描述。
1赞 Sam Varshavchik 9/27/2022
我认为这里存在语言障碍。技术术语(如“未定义”和“null”)在 C++ 中具有某些特定含义,但此处不适用。我怀疑你的意思是“空的”,但我不能假设。假设是这样:上面的描述几乎可以直接翻译成C++,完全按原样。如果需要,应尝试使用调试器自行实现此逻辑比较,并具体询问生成的代码是否无法正常工作,并且无法找出原因。

答:

3赞 Matt Cummins 9/27/2022 #1

我假设是.stringstd::string

这里真正的解决方案是使用而不是管理你自己的动态内存:std::vector<std::string>

std::vector<std::string> first;
//some definitions

std::vector<std::string> second;
//some definitions

bool equal = (first == second); // does what you want

如果由于某种原因不能使用 ,则 C 样式方法将如下所示std::vector

bool are_equal(std::string* first, std::size_t first_size, std::string* second, std::size_t second_size) {
    if (first_size != second_size) return false;
    for (std::size_t idx = 0; idx != first_size; ++idx) {
        if (first[idx] != second[idx]) return false;
    }
    return true;
}

int main() {
    string* first = new string[a];
    //some definitions

    string* second = new string[b];
    //some definitions

    bool equal = are_equal(first, a, second, b);
    return 0;
}

使用 C++20,首选在此处使用std::span

bool are_equal(std::span<const std::string> first, std::span<const std::string> second) {
    if (first.size() != second.size()) return false;
    for (std::size_t idx = 0; idx != first.size(); ++idx) {
        if (first[idx] != second[idx]) return false;
    }
    return true;
}

    int main() {
    string* first = new string[a];
    //some definitions

    string* second = new string[b];
    //some definitions

    bool equal = are_equal({first, a}, {second, b});
    return 0;
}