向vector中插入struct?及v(data.x)索引操作的功能与复现问题
1. 如何向vector中插入struct?
这个操作其实和插入普通数据类型没啥区别,我给你整理几个常用的方法,直接上手就能用:
用
push_back插入结构体对象
先定义好你的结构体,然后创建实例或者直接临时构造对象丢进去就行:#include <vector> using namespace std; // 先定义结构体 struct SensorData { int id; float temperature; }; int main() { vector<SensorData> data_list; // 方式1:先创建对象再插入 SensorData sensor1 = {1, 25.3}; data_list.push_back(sensor1); // 方式2:直接临时构造插入,更简洁 data_list.push_back({2, 26.1}); return 0; }用
emplace_back直接在vector里构造结构体
这个方法更高效,因为它会直接在vector的内存空间里构造结构体,省去了额外的拷贝步骤:// 直接传入结构体构造函数的参数就行 data_list.emplace_back(3, 24.8);插入到vector的指定位置
如果要在中间某个位置插入,用insert方法:// 在第一个元素的位置插入新结构体 data_list.insert(data_list.begin(), {0, 23.5});
2. 关于
v(data.x)操作的解析与复现 我先给你拆解这个操作的逻辑,再告诉你怎么复现:
首先这个操作本质是索引映射——用data.x里的每个元素作为索引,从v中取出对应位置的值,最后把这些值拼成一个和data.x长度一样的新向量。
先理清楚核心逻辑:
你的v是175x1的概率向量,data.x是8156x1、元素0-400的向量,执行v(data.x)后得到8156x1的结果,说明:
- 遍历
data.x的每一个元素idx,取v中第idx个位置的元素(这里要注意索引是从0还是1开始,比如MATLAB里索引从1开始,C++从0开始) - 如果
data.x里有超过174的元素(假设v的索引从0开始,最大索引是174),原代码大概率做了取模处理,把0-400的数值映射到0-174的范围内,比如idx % 175
不同环境下的复现方法:
如果你用的是MATLAB:
这是MATLAB原生支持的索引操作,直接写就行:
% 假设v是175x1的概率向量,data.x是8156x1的整数向量 % 先处理可能的超出范围的索引(如果data.x有大于175的元素) valid_indices = mod(data.x - 1, 175) + 1; % 把0-400映射到1-175(MATLAB索引从1开始) result = v(valid_indices); % 得到8156x1的向量
如果你用的是C++:
C++的std::vector默认没有operator(),所以原代码要么用了数值库(比如Eigen),要么自定义了重载。我给你写一个手动实现的版本:
#include <vector> #include <iostream> using namespace std; // 自定义一个支持索引映射的向量类 class ProbVector { private: vector<double> vec_data; public: // 构造函数,传入原始概率向量 ProbVector(const vector<double>& v) : vec_data(v) {} // 重载operator(),实现索引映射 vector<double> operator()(const vector<int>& indices) const { vector<double> result; result.reserve(indices.size()); // 提前分配内存,提升效率 for (int idx : indices) { // 处理超出范围的索引,取模得到合法位置 int valid_idx = idx % vec_data.size(); if (valid_idx < 0) valid_idx += vec_data.size(); // 处理负数情况 result.push_back(vec_data[valid_idx]); } return result; } }; int main() { // 初始化175x1的概率向量 vector<double> v(175, 0.0057); // 这里随便给个示例值 // 初始化8156x1的索引向量data.x vector<int> x(8156); // 假设这里填充x的元素为0-400的随机值 for (int i = 0; i < 8156; ++i) { x[i] = rand() % 401; } // 执行映射操作 ProbVector prob_v(v); vector<double> result = prob_v(x); // 结果就是8156x1的向量 return 0; }
如果原代码用了Eigen库,那Eigen的向量原生支持类似操作,比如:
#include <Eigen/Dense> using namespace Eigen; int main() { VectorXd v(175); v.setConstant(0.0057); VectorXi x(8156); x.setRandom(); x = x.cwiseAbs() % 401; // 生成0-400的元素 VectorXd result = v(x.asArray()); // 直接用索引数组获取结果 return 0; }
内容的提问来源于stack exchange,提问作者user469216
相关产品推荐
相关产品推荐

