C 检查元素是否为std :: vector
C++ check if element is std::vector
我想通过向量迭代并检查元素是向量还是字符串。另外,我还需要一种将不同的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();
}
当然,您可以为要处理的任何其他类型添加更多的过载。
- 使用std::vector的OpenCL矩阵乘法
- POCO::PostgreSQL:如何将std::vector支持添加到`Binder::bind`
- std::vector的包装器,使数组的结构看起来像结构的数组
- 编译器如何区分std::vector的构造函数
- 使用 pqxx 将 std::vector 存储在 postgresql 中,并从数据库中检索它
- 在std::vector上存储带有模板的类实例
- 在main()之外初始化std::vector会导致性能下降(多线程)
- 为什么std::vector比数组慢
- std::vector::迭代器是否可以合法地作为指针
- 如何将二进制格式的 C++ 对象的 std::vector 保存到磁盘?
- 为什么std::vector和std::valarray初始化构造函数不同
- ";结果类型必须是可从输入范围的值类型""构造的;创建std::vector时
- 在没有未定义行为的情况下实现类似std::vector的容器
- 如何调整 std::vector of Eigen::MatrixXd 的大小
- 使用 std::vector::reverse_iterator 将 int 序列化为字节向量?
- 如何将AERT_Allocate与 std:vector 一起使用
- 推导 std::vector::back() 的返回类型
- 如何将原始字节附加到 std::vector?
- std::vector 没有重载函数的实例与参数列表匹配
- 如果 KEY 是 std::list 或 std::vector 而不是值,那么 std::map 的默认行为是什么?