gpt4 book ai didi

C++:字符串结构的相等性

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

在我的代码中有一个结构,类似于以下内容:

struct basket { 
std::string a;
std::string b;
std::string c;
std::string d;
};

我希望能够比较两个结构并通过比较所有这些字符串的串联来确定 > 0、< 0、== 0

std::string total = (a+b+c+d);

但是,我想在不进行实际连接的情况下实现这一点,因为这种比较被多次使用,最终成为运行时瓶颈。我知道如果是这样的话,我应该考虑避免使用字符串,但现在我只想轻松地进行比较而不连接。

现在,我使用一个巨大的 if 语句。例如比较结构的每个实例中的字符串 a,如果它们相同,则比较 b,如果它们相同,则比较 c,如果它们相同则最后比较 d,但我想知道是否有在 C++ 中执行此操作的更简洁的方法没有连接的运行时命中。

谢谢。

最佳答案

如果我没理解错的话,如果字符串的连接相等,您希望两个结构相等,所以

a == "hello", b == "there", ...

匹配

a = "hel", b == "lothere", ...

我会使用 boost::range::join 来做到这一点:

struct basket {
...
bool operator==(const basket& other) const
{
using namespace boost::range;
auto left = join(join(join(a, b), c), d);
auto right = join(join(join(other.a, other.b), other.c), other.d);
return equal(left, right); // http://www.boost.org/doc/libs/1_51_0/libs/range/doc/html/range/reference/algorithms/non_mutating/equal.html
}
};

boost::range::join ( http://www.boost.org/doc/libs/1_57_0/libs/range/doc/html/range/reference/utilities/join.html ) 在不进行连接的情况下创建一个连接范围。它在内部只是一直迭代。唯一的额外开销是检查第一个范围的末尾并移动到第二个范围,因此它应该比实际连接快得多。

更新:我最初错过了对 strcmp 样式返回的渴望。不幸的是,我找不到任何返回这样值的标准算法。不过,从好的方面来说,它很容易编写。这是更新版本,使用 compare 而不是 equal:

#include <boost/range/join.hpp>

template <typename SinglePassRange1, typename SinglePassRange2>
int compare(const SinglePassRange1& left, const SinglePassRange2& right)
{
using namespace std;
auto leftIt = begin(left);
auto leftEnd = end(right);
auto rightIt = begin(right);
auto rightEnd = end(right);

for ( ; leftIt != leftEnd
&& rightIt != rightEnd
&& *leftIt == *rightIt
; ++leftIt, ++rightIt)
{
}
// should be safe since one-past-end for strings is '\0'
return static_cast<int>(*leftIt) - static_cast<int>(*rightIt);
}

struct basket {
std::string a;
std::string b;
std::string c;
std::string d;

int compare(const basket& other) const
{
using namespace boost::range;
auto left = join(join(join(a, b), c), d);
auto right = join(join(join(other.a, other.b), other.c), other.d);

return ::compare(left, right);
}
};

在 GCC 4.9.1 Ubuntu 上测试。

compare 自由函数可能应该称为 compareStringRanges 或其他名称,因为该实现仅对字符串有效。我将把它留给个人美学领域。

关于C++:字符串结构的相等性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27388272/

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