检查 MFC C++中的数组

Check Array in MFC C++

本文关键字:数组 C++ MFC 检查      更新时间:2023-10-16

我拥有的这段代码无法正常工作。

for (int i = 0; i <= 140; i++)
    {
        if (OneLine_Array.GetAt(i) == "Pass" || "Fail" || "Warn" || "Active")
        {
            OneLine_State.Add(OneLine_Array.GetAt(i));
        }
    }

如果我有它,它会起作用

for (int i = 0; i <= 140; i++)
    {
        if ((OneLine_Array.GetAt(i) == "Pass") || (OneLine_Array.GetAt(i) == "Fail") || (OneLine_Array.GetAt(i) == "Warn") || (OneLine_Array.GetAt(i) == "Active"))
        {
            OneLine_State.Add(OneLine_Array.GetAt(i));
        }
    }

我想知道是否有一种更短的方法可以做到这一点,而不是一遍又一遍地复制同一行代码?

谢谢。

您可以在到达条件之前存储GetAt的结果,然后无需多次评估它:

auto x = OneLine_Array.GetAt(i);
if (x == "Pass" || x == "Fail" || x == "Warn" || x == "Active")

对于足够短的变量名(但请称其为比x更好的名称),这将比您的第二个示例短。

你的原始条件不起作用的原因是"Fail""Warn""Active"中的每一个都是true的,所以逻辑OR也将true。它们是true因为它们是数组类型,可以转换为指向其第一个元素(char*)的指针。非空指针将转换为 true

你不能这样做(OneLine_Array.GetAt(i) == "Pass" ||"失败" ||"警告" ||"活动") ==>这在C++中是不可能的

最好

将 OneLine_Array.GetAt(i) 的字符串保存在变量中并制作"=="

既然你提到了 MFC C++。为了获得更好的性能,我建议使用 CMap (http://msdn.microsoft.com/en-us/library/s897094z.aspx) 来存储字符串。它确实加快了比较速度。

虽然

我更喜欢@sftrabbit回答的内容,但您可以为此编写一个小助手。

template<typename A, typename B>
bool equals_one_of(const A& a, const B& b)
{
    return a == b;
}
template<typename A, typename B, typename... Args>
bool equals_one_of(const A& a, const B& b, const Args&... args)
{
    return equals_one_of(a, b) || equals_one_of(a, args...);
}

int f()
{
    if (equals_one_of(OneLine_Array.GetAt(i), "Pass", "Fail", "Warn", "Active"))
    {
        // ....
    }
}