C 检查元素是否为std :: vector

C++ check if element is std::vector

本文关键字:std vector 是否 检查 元素      更新时间:2023-10-16

我想通过向量迭代并检查元素是向量还是字符串。另外,我还需要一种将不同的vecors传递到功能的方法。这样的东西:

using namespace std;
string toCustomString(<some vector> vec) {
    string ret = "";
    for(size_t i = 0; i < vec.length(); ++i) 
        if (vec[i] == %vector%)
            ret += toCustomString(vec[i]);
        else //if type of vec[i] is string
            ret += "foo"+vec[i]+"bar";
    }
    return ret;
}
  • 好吧,首先,我需要知道如何正确检查vec [i]是否是std :: vector

  • 然后,我需要知道如何定义函数的paramater以接受任何类型的(多维)向量

std::vector只能包含一种类型 - 即std::vector<T>中的T,可以使用成员value_type访问。

您可能正在寻找的是模板专业:

template<typename T>
string toCustomString(std::vector<T> vec) {
    // general case
}
template<>
string toCustomString<std::string>(std::vector<std::string> vec) {
    // strings
}

(如果您想在所有向量上部分专业化它,那么您需要将其提起到结构)

如果您真的想在向量中存储字符串和向量

通常,您的 <some vector> vec将具有 vector<string> vector<vector<string>>,例如。

为了声明该变量,您需要它的类型,并且其类型还准确地指定了它存储的内容。

现在,您可以使用boost.variant(或滚动自己的歧视联盟)来解决此问题,例如:

typedef boost::variant<std::string, std::vector<std::string>> Vec_of_StringOrVec;

但Dirk Holsopple是对的,这不是惯用的C ,您可能会寻找其他方法。

正如每个人所说的,C 中的向量仅保持一种类型。依次检查每个元素的类型没有必要或点,这也一样,因为没有办法这样做。相反,您要做的是在参数类型上重载函数。这样的东西:

string toCustomString(const string &str) {
    return "foo" +str + "bar";
}
template <typename T>
string toCustomString(const std::vector<T> &vec) {
    string ret;
    for(size_t i = 0; i < vec.size(); ++i) 
        ret += toCustomString(vec[i]);
    return ret;
}

现在,如果有人将vector<string>传递到toCustomString中,则调用toCustomString(vec[i])将选择toCustomString(const string &str)超载。

如果有人将vector<int>传递到toCustomString中,则代码将不会编译,因为(当前)没有toCustomString(int) Overload [*]。

如果有人将vector<vector<string>>传递给toCustomString,则toCustomString(vec[i])将通过vector<string>,请参见上文。

在所有三种情况下,不同的 toCustomString函数均调用。在第一种情况下,它是toCustomString<string>(const vector<string>&),它是第三种情况toCustomString<vector<string>>(const vector<vector<string>>&)toCustomString模板的另一个实例化。中间情况试图实例化toCustomString<int>,但由于toCustomString(v[i])不匹配其知道的任何功能而失败。

所有这些都是在编译时确定的。模板的重点是创建多个功能(或类),它们之间有特定的差异。在这种情况下,差异是传递的向量的类型。

[*]这似乎与您的说法一致,即vec[i]必须是 a vector a字符串,而不是任何第三个选项。例如,如果您想要vector<something_else>为空的返回值,则可以添加一个catch-all模板:

template <typename T> 
string toCustomString(const T &) { 
    return string(); 
}

当然,您可以为要处理的任何其他类型添加更多的过载。