在C++中,std::vector
是一个动态数组,用于存储相同类型的元素。如果要在std::vector
中存储多种类型的数据,可以使用std::variant
或std::any
。
std::variant
std::variant
是C++17引入的一种类型安全的联合类型,它可以存储多种类型的数据,但是需要在编译时确定可能的类型。
#include<iostream>
#include<vector>
#include<variant>
int main() {
std::vector<std::variant<int, double, std::string>> vec;
vec.push_back(42);
vec.push_back(3.14);
vec.push_back("hello");
for (const auto& item : vec) {
std::visit([](const auto& value) {
using T = std::decay_t<decltype(value)>;
if constexpr (std::is_same_v<T, int>) {
std::cout << "int: "<< value<< std::endl;
} else if constexpr (std::is_same_v<T, double>) {
std::cout << "double: "<< value<< std::endl;
} else if constexpr (std::is_same_v<T, std::string>) {
std::cout << "string: "<< value<< std::endl;
}
}, item);
}
return 0;
}
std::any
std::any
是C++17引入的一种类型安全的容器,可以存储任何类型的数据。
#include<iostream>
#include<vector>
#include <any>
int main() {
std::vector<std::any> vec;
vec.push_back(42);
vec.push_back(3.14);
vec.push_back("hello");
for (const auto& item : vec) {
if (item.type() == typeid(int)) {
std::cout << "int: "<< std::any_cast<int>(item)<< std::endl;
} else if (item.type() == typeid(double)) {
std::cout << "double: "<< std::any_cast<double>(item)<< std::endl;
} else if (item.type() == typeid(std::string)) {
std::cout << "string: "<< std::any_cast<std::string>(item)<< std::endl;
}
}
return 0;
}
这两种方法都可以实现在std::vector
中存储多种类型的数据,但是std::variant
更加类型安全,而std::any
更加灵活。在选择使用哪种方法时,需要根据具体的需求和场景来决定。
领取专属 10元无门槛券
手把手带您无忧上云