在向量中读取和写入不同类型的内容
Read and write different types in vector
如何在向量中打包几种不同的原始数据类型以及字符串来检查内容?
(在Java中,这是通过Object [] objects = {1.0, "Hello", - 42, 'b'}
进行的)
任务如下:给定以下数组:[3.0,42, "Monkey", 7.2, b]
此数组将传递给在控制台上输出数组内容的方法。如果是string
,字符串的每个字母都应作为 ASCII 值添加到同一变量中,最后在控制台上作为int
返回。与char
完全相同。
从今天开始,当我创建一个vector
时,我知道std::vector<double> numbers = {1.0,2.0};
如何编写函数以及如何访问索引numbers[i];
以及向量numbers.size()
的长度。
我现在该如何解决这个问题?由于不幸的是,我没有为向量中的多种类型找到简单的 <- 解决方案。
提前致谢:)
C++不像Java那样执行类型擦除。要创建一个异构容器(这是您尝试执行的操作的技术术语),您需要广泛使用std::any
或std::variant
,这是 C++17 引入的新类。
std::vector<std::any> values{1.0, "Hello", -42, 'b'};
for(auto & any : values) {
int * i;
if(val = std::any_cast<int>(&any)) std::cout << "int: " << *i << std::endl;
const char ** s;
if(s = std::any_cast<const char *>(&any)) std::cout << "string-literal: " << *s << std::endl;
double * d;
if(d = std::any_cast<double>(&any)) std::cout << "double: " << *d << std::endl;
char * c;
if(c = std::any_cast<char>(&any)) std::cout << "char: " << *c << std::endl;
}
请注意该代码有多混乱。尤其是因为许多人希望"hello"
存储为std::string
对象,但除非用户明确指定它,否则无法做到这一点:
std::vector<std::any> values{1.0, std::string{"Hello"}, -42, 'b'};
无论如何,我个人的观点是,使用std::variant
会更适合,因为您可以更清楚地说明容器的使用方式,并且可以避免与std::any
相关的动态分配:
typedef std::variant<std::string, char, double, int> my_variant;
struct visitor {
void operator()(std::string const& v) const {
std::cout << "std::string: " << v<< std::endl;
}
void operator()(double const& v) const {
std::cout << "double: " << v << std::endl;
}
void operator()(int const& v) const {
std::cout << "int: " << v << std::endl;
}
void operator()(char const& v) const {
std::cout << "char: " << v << std::endl;
}
};
int main() {
std::vector<my_variant> values{1.0, "Hello", -42, 'b'};
for(my_variant & variant : values) {
std::visit(visitor{}, variant);
}
return 0;
}
如果我们不需要知道类型,我们甚至可以使用 lambdaauto
使变体版本简单得多:
typedef std::variant<std::string, char, double, int> my_variant;
int main() {
std::vector<my_variant> values{1.0, "Hello", -42, 'b'};
for(my_variant & variant : values) {
std::visit(
[](auto const& val) {std::cout << "Some unknown type: " << val << std::endl;},
variant
);
}
return 0;
}
我还没有通过我的编译器运行它,但这应该可以很好地了解如何在C++中完成此类任务。
如果您无法访问 C++17,您可以使用boost.any和boost.variant,我有理由确定它们都是仅标头库,因此很容易导入到您的项目中。
- 基类类型向量中的派生结构
- 从自定义数据类型向量中删除重复元素
- C++:自定义数据类型向量错误的队列
- C++ - 按自定义数据类型向量的值删除元素
- 在 C++ 中创建类型向量
- 添加字符串向量和不同数据类型向量的映射
- 初始化一个类型向量的巨大向量<int>
- 没有操作员=的类型向量的实例化
- 复杂数据类型向量的迭代器
- 比较两个用户定义的类型向量
- 如何声明二维模板化类类型向量?
- 尝试将用户定义的向量类型插入用户定义的类型向量
- 类类型向量的打印内容
- 如何在 C++ 中将结构类型向量数据输入到结构向量成员(嵌套结构向量)中
- 如何使用新字符串而不是分配器创建自己的字符串类型向量?
- <T> 在使用运算符+ 连接两个向量之前从类型向量中删除索引
- 从自定义数据类型向量数组C 删除
- 如何打印类型向量<元组<字符串、int、int>> 以筛选 c++?
- 正在输出类型向量的成员类型
- 引用类类型向量中的对象成员