#include <iostream> // 标准输入输出流
#include <fstream> // 文件操作
#include <vector> // 用于存储IQ样本
#include <cmath> // 数学函数:cos, sin, PI 等
#include <random> // 用于生成高斯噪声
// 定义 π 常量,用于三角函数计算
const double PI = 3.14159265358979323846;
// LINK 4A 参数
const int SAMPLE_RATE = 48000; // 采样率(Hz)
const double BIT_RATE = 5000.0; // 数据速率 5 kbps
const double BIT_DURATION = 1.0 / BIT_RATE; // 每个比特持续时间(秒)
const double CARRIER_FREQ = 300e6; // 载波频率(300 MHz)
// 模拟发送的二进制数据(例如指令)
const std::vector<bool> BINARY_DATA = {
1, 0, 1, 1, 0, 0, 1, 1, 0, 1
};
// 定义 IQ 样本结构体,用于存储 I 和 Q 分量
struct IQSample {
double I; // 同相分量
double Q; // 正交分量
};
// 函数:生成 BPSK 调制的 IQ 数据
std::vector<IQSample> generateBPSKSignal(const std::vector<bool>& data) {
std::vector<IQSample> iqSignal; // 存储生成的 IQ 数据
// 每个比特对应的采样点数 = 采样率 × 比特持续时间
int samplesPerBit = static_cast<int>(SAMPLE_RATE * BIT_DURATION);
// 遍历每个比特
for (bool bit : data) {
// 根据比特值确定相位:1 → 0°, 0 → 180°
double phase = bit ? 0.0 : PI;
// 对每个比特生成 samplesPerBit 个采样点
for (int i = 0; i < samplesPerBit; ++i) {
// 当前时间 t = 样本总数 / 采样率
double t = static_cast<double>(iqSignal.size()) / SAMPLE_RATE;
// BPSK 调制:s(t) = cos(2πf_c t + φ)
double I = cos(2 * PI * CARRIER_FREQ * t + phase);
double Q = sin(2 * PI * CARRIER_FREQ * t + phase);
// 将当前时刻的 I 和 Q 存入 IQ 样本
iqSignal.push_back({ I, Q });
}
}
return iqSignal;
}
// 函数:添加高斯白噪声(AWGN)
std::vector<IQSample> addAWGNNoise(const std::vector<IQSample>& iqSignal, double noise_std = 0.1) {
std::vector<IQSample> noisyIQ;
std::default_random_engine generator; // 随机数引擎
std::normal_distribution<double> distribution(0.0, noise_std); // 均值为0,标准差为noise_std
for (const auto& sample : iqSignal) {
double noise_I = distribution(generator); // I 分量噪声
double noise_Q = distribution(generator); // Q 分量噪声
noisyIQ.push_back({
sample.I + noise_I, // 添加噪声后的 I
sample.Q + noise_Q // 添加噪声后的 Q
});
}
return noisyIQ;
}
// 函数:将 IQ 数据归一化到 [0, 65535] 范围
std::vector<std::pair<unsigned short, unsigned short>> normalizeIQ(
const std::vector<IQSample>& iqSignal) {
std::vector<std::pair<unsigned short, unsigned short>> normalizedIQ;
for (const auto& sample : iqSignal) {
// 归一化公式:(value + 1.0) / 2.0 * 65535
unsigned short I_norm = static_cast<unsigned short>(
(sample.I + 1.0) / 2.0 * 65535
);
unsigned short Q_norm = static_cast<unsigned short>(
(sample.Q + 1.0) / 2.0 * 65535
);
normalizedIQ.emplace_back(I_norm, Q_norm);
}
return normalizedIQ;
}
// 函数:将归一化后的 IQ 数据保存为 CSV 文件(逗号分隔值,方便 Excel 打开)
void saveNormalizedIQToFile(
const std::vector<std::pair<unsigned short, unsigned short>>& iqSignal,
const std::string& filename) {
// 打开文件输出流
std::ofstream file(filename);
// 检查是否打开成功
if (!file) {
std::cerr << "无法打开文件:" << filename << std::endl;
return;
}
// 写入 CSV 文件的表头(可选)
file << "I,Q" << std::endl;
// 遍历归一化后的 IQ 数据并写入文件,使用逗号分隔
for (const auto& sample : iqSignal) {
file << sample.first << "," << sample.second << std::endl;
}
// 关闭文件
file.close();
// 输出提示信息
std::cout << "归一化后的 LINK 4A IQ CSV 数据已保存至文件:" << filename << std::endl;
}
// 主函数
int main()
{
// 生成原始 BPSK IQ 数据
std::vector<IQSample> iqSignal = generateBPSKSignal(BINARY_DATA);
// 添加高斯白噪声
std::vector<IQSample> noisyIQ = addAWGNNoise(iqSignal, 0.1); // 噪声标准差设为 0.1
// 归一化 IQ 数据到 [0, 65535]
auto normalizedIQ = normalizeIQ(noisyIQ);
// 保存归一化后的 IQ 数据到文件
saveNormalizedIQToFile(normalizedIQ, "noisy_normalized_link4a_iq_data.csv");
// 程序正常退出
return 0;
}
#if 0
#include <iostream>
#include <unordered_map>
#include <vector>
#include <string>
#include <algorithm>
#include <random>
// 定义一个结构体 targetInfo,用于存储目标的相关信息
// 包含目标名称、目标距离和目标新距离
struct targetInfo
{
std::string targetName; // 目标的名称
int targetDistance; // 目标的距离
int targetNewDistance; // 目标的新距离
};
// 使用 typedef 为 targetInfo 结构体定义一个别名 targetInfoStruct
using targetInfoStruct = struct targetInfo;
// 生成指定范围 [min, max] 的随机整数
int generateRandomNumber(int min, int max) {
std::random_device rd;
std::mt19937 gen(rd());
std::uniform_int_distribution<> dis(min, max);
return dis(gen);
}
int main()
{
// 定义一个 unordered_map,键为 std::string 类型,表示平台名称
// 值为 std::vector<targetInfoStruct> 类型,表示该平台对应的目标信息列表
std::unordered_map<std::string, std::vector<targetInfoStruct>> platTargetMap;
// 插入一些示例数据
// 创建一个 targetInfoStruct 类型的对象 info1,并初始化其成员变量
targetInfoStruct info1;
info1.targetName = "target1";
info1.targetDistance = 0;
info1.targetNewDistance = -1;
// 创建一个 targetInfoStruct 类型的对象 info2,并初始化其成员变量
targetInfoStruct info2;
info2.targetName = "target2";
info2.targetDistance = 0;
info2.targetNewDistance = -1;
// 创建一个 targetInfoStruct 类型的对象 info3,并初始化其成员变量
targetInfoStruct info3;
info3.targetName = "target3";
info3.targetDistance = 0;
info3.targetNewDistance = -1;
// 创建一个 targetInfoStruct 类型的对象 info4,并初始化其成员变量
targetInfoStruct info4;
info4.targetName = "target4";
info4.targetDistance = 0;
info4.targetNewDistance = -1;
// 创建一个 targetInfoStruct 类型的对象 info5,并初始化其成员变量
targetInfoStruct info5;
info5.targetName = "target5";
info5.targetDistance = 0;
info5.targetNewDistance = -1;
// 将 info1 添加到不同平台对应的目标信息列表中
platTargetMap["platform1"].push_back(info1);
platTargetMap["platform2"].push_back(info1);
platTargetMap["platform3"].push_back(info1);
platTargetMap["platform4"].push_back(info1);
// 将 info2 添加到不同平台对应的目标信息列表中
platTargetMap["platform1"].push_back(info2);
platTargetMap["platform2"].push_back(info2);
platTargetMap["platform3"].push_back(info2);
platTargetMap["platform4"].push_back(info2);
// 将 info3 添加到部分平台对应的目标信息列表中
platTargetMap["platform2"].push_back(info3);
platTargetMap["platform3"].push_back(info3);
platTargetMap["platform4"].push_back(info3);
platTargetMap["platform3"].push_back(info4);
platTargetMap["platform4"].push_back(info4);
// 将 info5 添加到特定平台对应的目标信息列表中
platTargetMap["platform5"].push_back(info5);
// 遍历 platTargetMap,更新每个目标的距离信息
for (std::unordered_map<std::string, std::vector<targetInfoStruct>>::iterator it = platTargetMap.begin(); it != platTargetMap.end(); ++it)
{
// 获取当前平台的名称
std::string key = it->first;
// 获取当前平台对应的目标信息列表的引用
std::vector<targetInfoStruct>& tmpVec = it->second;
// 遍历当前平台对应的目标信息列表
for (int i = 0; i < tmpVec.size(); ++i)
{
// 构造一个临时字符串,由平台名称和目标名称组成
std::string tmpString = key + tmpVec[i].targetName;
// 根据临时字符串的长度更新目标的距离信息
tmpVec[i].targetDistance = tmpString.length() + generateRandomNumber(1, 100);
}
}
// 再次遍历 platTargetMap,输出每个平台及其对应的目标信息
for (std::unordered_map<std::string, std::vector<targetInfoStruct>>::iterator it = platTargetMap.begin(); it != platTargetMap.end(); ++it)
{
// 获取当前平台的名称
std::string key = it->first;
// 输出当前平台的名称
std::cout << key << std::endl;
// 获取当前平台对应的目标信息列表的副本
std::vector<targetInfoStruct> tmpVec = it->second;
// 遍历当前平台对应的目标信息列表
for (int i = 0; i < tmpVec.size(); ++i)
{
// 输出目标的名称、距离和新距离信息
std::cout << " targetName " << tmpVec[i].targetName << " targetDistance " << tmpVec[i].targetDistance << " targetNewDistance " << tmpVec[i].targetNewDistance << std::endl;
}
}
// 定义一个无序映射 minDistanceMap,用于存储每个目标名称对应的最小距离
// 键为目标名称,值为该目标的最小距离
std::unordered_map<std::string, int> minDistanceMap;
// 遍历 platTargetMap,它是一个无序映射,键为平台名称,值为目标信息结构体的向量
for (const std::pair<const std::string, std::vector<targetInfoStruct>>& pair : platTargetMap) {
// 从当前的键值对中取出值,即目标信息结构体的向量,并将其引用赋值给 tmpVec
const std::vector<targetInfoStruct>& tmpVec = pair.second;
// 遍历当前平台对应的目标信息结构体向量
for (const targetInfoStruct& info : tmpVec) {
// 检查 minDistanceMap 中是否已经存在当前目标名称的键
if (minDistanceMap.find(info.targetName) == minDistanceMap.end()) {
// 如果不存在,则将当前目标的距离作为该目标的最小距离存入 minDistanceMap
minDistanceMap[info.targetName] = info.targetDistance;
}
else {
// 如果已经存在,则比较当前目标的距离和 minDistanceMap 中存储的该目标的最小距离
// 取较小值作为新的最小距离更新到 minDistanceMap 中
minDistanceMap[info.targetName] = std::min(minDistanceMap[info.targetName], info.targetDistance);
}
}
}
// 再次遍历 platTargetMap,这次是为了更新每个目标的新距离信息
for (std::pair<const std::string, std::vector<targetInfoStruct>>& pair : platTargetMap) {
// 从当前的键值对中取出值,即目标信息结构体的向量,并将其引用赋值给 tmpVec
std::vector<targetInfoStruct>& tmpVec = pair.second;
// 遍历当前平台对应的目标信息结构体向量
for (targetInfoStruct& info : tmpVec) {
// 检查当前目标的距离是否等于该目标在 minDistanceMap 中存储的最小距离
if (info.targetDistance == minDistanceMap[info.targetName]) {
// 如果相等,则将该目标的新距离设为 0
info.targetNewDistance = 0;
}
else {
// 如果不相等,则将该目标的新距离设为当前距离减去最小距离
info.targetNewDistance = info.targetDistance - minDistanceMap[info.targetName];
}
}
}
// 再次遍历 platTargetMap,输出每个平台及其对应的目标信息
for (std::unordered_map<std::string, std::vector<targetInfoStruct>>::iterator it = platTargetMap.begin(); it != platTargetMap.end(); ++it)
{
// 获取当前平台的名称
std::string key = it->first;
// 输出当前平台的名称
std::cout << key << std::endl;
// 获取当前平台对应的目标信息列表的副本
std::vector<targetInfoStruct> tmpVec = it->second;
// 遍历当前平台对应的目标信息列表
for (int i = 0; i < tmpVec.size(); ++i)
{
// 输出目标的名称、距离和新距离信息
std::cout << " targetName " << tmpVec[i].targetName << " targetDistance " << tmpVec[i].targetDistance << " targetNewDistance " << tmpVec[i].targetNewDistance << std::endl;
}
}
return 0;
}
#endif
#if 0
#include <iostream>
#include <unordered_map>
#include <vector>
#include <string>
// 定义一个结构体 targetInfo,用于存储目标的相关信息
// 包含目标名称、目标距离和目标新距离
struct targetInfo
{
std::string targetName; // 目标的名称
int targetDistance; // 目标的距离
int targetNewDistance; // 目标的新距离
};
// 使用 typedef 为 targetInfo 结构体定义一个别名 targetInfoStruct
using targetInfoStruct = struct targetInfo;
int main()
{
// 定义一个 unordered_map,键为 std::string 类型,表示平台名称
// 值为 std::vector<targetInfoStruct> 类型,表示该平台对应的目标信息列表
std::unordered_map<std::string, std::vector<targetInfoStruct>> platTargetMap;
// 插入一些示例数据
// 创建一个 targetInfoStruct 类型的对象 info1,并初始化其成员变量
targetInfoStruct info1;
info1.targetName = "target1";
info1.targetDistance = 0;
info1.targetNewDistance = -1;
// 创建一个 targetInfoStruct 类型的对象 info2,并初始化其成员变量
targetInfoStruct info2;
info2.targetName = "target2";
info2.targetDistance = 0;
info2.targetNewDistance = -1;
// 创建一个 targetInfoStruct 类型的对象 info3,并初始化其成员变量
targetInfoStruct info3;
info3.targetName = "target3";
info3.targetDistance = 0;
info3.targetNewDistance = -1;
// 创建一个 targetInfoStruct 类型的对象 info4,并初始化其成员变量
targetInfoStruct info4;
info4.targetName = "target4";
info4.targetDistance = 0;
info4.targetNewDistance = -1;
// 将 info1 添加到不同平台对应的目标信息列表中
platTargetMap["platform1"].push_back(info1);
platTargetMap["platform2"].push_back(info1);
platTargetMap["platform3"].push_back(info1);
platTargetMap["platform4"].push_back(info1);
// 将 info2 添加到不同平台对应的目标信息列表中
platTargetMap["platform1"].push_back(info2);
platTargetMap["platform2"].push_back(info2);
platTargetMap["platform3"].push_back(info2);
platTargetMap["platform4"].push_back(info2);
// 将 info3 添加到部分平台对应的目标信息列表中
platTargetMap["platform2"].push_back(info3);
platTargetMap["platform3"].push_back(info3);
platTargetMap["platform4"].push_back(info3);
// 将 info4 添加到特定平台对应的目标信息列表中
platTargetMap["platform4"].push_back(info4);
// 遍历 platTargetMap,更新每个目标的距离信息
for (std::unordered_map<std::string, std::vector<targetInfoStruct>>::iterator it = platTargetMap.begin(); it != platTargetMap.end(); ++it)
{
// 获取当前平台的名称
std::string key = it->first;
// 获取当前平台对应的目标信息列表的引用
std::vector<targetInfoStruct>& tmpVec = it->second;
// 遍历当前平台对应的目标信息列表
for (int i = 0; i < tmpVec.size(); ++i)
{
// 构造一个临时字符串,由平台名称和目标名称组成
std::string tmpString = key + tmpVec[i].targetName;
// 根据临时字符串的长度更新目标的距离信息
tmpVec[i].targetDistance = tmpString.length();
}
}
// 再次遍历 platTargetMap,输出每个平台及其对应的目标信息
for (std::unordered_map<std::string, std::vector<targetInfoStruct>>::iterator it = platTargetMap.begin(); it != platTargetMap.end(); ++it)
{
// 获取当前平台的名称
std::string key = it->first;
// 输出当前平台的名称
std::cout << key << std::endl;
// 获取当前平台对应的目标信息列表的副本
std::vector<targetInfoStruct> tmpVec = it->second;
// 遍历当前平台对应的目标信息列表
for (int i = 0; i < tmpVec.size(); ++i)
{
// 构造一个临时字符串,由平台名称和目标名称组成
std::string tmpString = key + tmpVec[i].targetName;
// 根据临时字符串的长度更新目标的距离信息
tmpVec[i].targetDistance = tmpString.length();
// 输出目标的名称、距离和新距离信息
std::cout << " targetName " << tmpVec[i].targetName << " targetDistance " << tmpVec[i].targetDistance << " targetNewDistance" << tmpVec[i].targetNewDistance << std::endl;
}
}
return 0;
}
#endif
#if 0
#include <iostream>
#include <unordered_map>
#include <vector>
#include <string>
struct targetInfo
{
std::string targetName;
int targetDistance;
int targetNewDistance;
};
using targetInfoStruct = struct targetInfo;
int main()
{
std::unordered_map<std::string, std::vector<targetInfoStruct>> platTargetMap;
// 插入一些示例数据
targetInfoStruct info1;
info1.targetName = "target1";
info1.targetDistance = 0;
info1.targetNewDistance = -1;
targetInfoStruct info2;
info2.targetName = "target2";
info2.targetDistance = 0;
info2.targetNewDistance = -1;
targetInfoStruct info3;
info3.targetName = "target3";
info3.targetDistance = 0;
info3.targetNewDistance = -1;
targetInfoStruct info4;
info4.targetName = "target4";
info4.targetDistance = 0;
info4.targetNewDistance = -1;
platTargetMap["platform1"].push_back(info1);
platTargetMap["platform2"].push_back(info1);
platTargetMap["platform3"].push_back(info1);
platTargetMap["platform4"].push_back(info1);
platTargetMap["platform1"].push_back(info2);
platTargetMap["platform2"].push_back(info2);
platTargetMap["platform3"].push_back(info2);
platTargetMap["platform4"].push_back(info2);
platTargetMap["platform2"].push_back(info3);
platTargetMap["platform3"].push_back(info3);
platTargetMap["platform4"].push_back(info3);
platTargetMap["platform4"].push_back(info4);
for (std::unordered_map<std::string, std::vector<targetInfoStruct>>::iterator it = platTargetMap.begin(); it != platTargetMap.end(); ++it)
{
std::string key = it->first;
std::vector<targetInfoStruct>& tmpVec = it->second;
for (int i = 0; i < tmpVec.size(); ++i)
{
std::string tmpString = key + tmpVec[i].targetName;
tmpVec[i].targetDistance = tmpString.length();
}
}
for (std::unordered_map<std::string, std::vector<targetInfoStruct>>::iterator it = platTargetMap.begin(); it != platTargetMap.end(); ++it)
{
std::string key = it->first;
std::cout << key << std::endl;
std::vector<targetInfoStruct> tmpVec = it->second;
for (int i = 0; i < tmpVec.size(); ++i)
{
std::string tmpString = key + tmpVec[i].targetName;
tmpVec[i].targetDistance = tmpString.length();
std::cout << " targetName " << tmpVec[i].targetName << " targetDistance " << tmpVec[i].targetDistance << " targetNewDistance" << tmpVec[i].targetNewDistance << std::endl;
}
}
return 0;
}
#endif
#if 0
#include <iostream>
#include <map>
#include <set>
#include <vector>
#include <string>
struct targetInfo
{
std::string targetName;
double targetDistance;
double targetNewDistance;
};
using targetInfoStruct = struct targetInfo;
int main()
{
std::map<std::string, std::vector<targetInfoStruct>> platTargetMap;
return 0;
}
#endif
#if 0
#include <iostream>
#include <map>
#include <set>
#include <vector>
#include <string>
// 计算字符串长度的函数
double calc(const std::string& str)
{
return static_cast<double>(str.length());
}
// 改造后的处理 resultMap 的函数
void processResultMap(std::map<std::string, std::vector<double>>& resultMap)
{
// 检查 resultMap 是否为空
if (resultMap.empty())
{
// 如果为空,直接返回,不进行后续处理
return;
}
// 获取 vector 的长度
std::map<std::string, std::vector<double>>::iterator firstIt = resultMap.begin();
// 取第一个键值对的值(即第一个 std::vector<double>),获取其长度
std::vector<double>::size_type vecSize = firstIt->second.size();
// 对 vector 中每个位置的元素进行处理
for (std::vector<double>::size_type i = 0; i < vecSize; ++i)
{
// 找到该位置的最小值
double minVal = resultMap.begin()->second[i];
// 遍历 resultMap 中的每个键值对
for (std::map<std::string, std::vector<double>>::iterator it = resultMap.begin(); it != resultMap.end(); ++it) {
// 如果当前键值对对应 vector 中第 i 个元素小于 minVal
if (it->second[i] < minVal) {
// 更新 minVal 为更小的值
minVal = it->second[i];
}
}
// 其余值减去最小值,最小值置为 0
for (std::map<std::string, std::vector<double>>::iterator it = resultMap.begin(); it != resultMap.end(); ++it) {
// 将当前键值对对应 vector 中第 i 个元素减去 minVal
it->second[i] -= minVal;
}
}
}
int main() {
// 定义 platTargetMap 并添加元素,且 set 中字符串长度不同
std::map<std::string, std::vector<std::string>> platTargetMap;
platTargetMap["plat1"] = { "target1", "target23", "1" }; // 12 13 6
platTargetMap["plat2"] = { "t1", "longerTargetHere", "22" }; // 7 21 7
platTargetMap["plat3"] = { "short", "aBitLongerTarget", "333" }; //10 21 8
// 存储结果的 resultMap
std::map<std::string, std::vector<double>> resultMap;
// 遍历 platTargetMap
for (std::map<std::string, std::vector<std::string>>::iterator outerIt = platTargetMap.begin(); outerIt != platTargetMap.end(); ++outerIt) {
std::string key = outerIt->first;
std::vector<std::string> values = outerIt->second;
std::vector<double> lengths;
// 遍历 set 中的元素
for (std::vector<std::string>::iterator innerIt = values.begin(); innerIt != values.end(); ++innerIt) {
std::string combined = key + *innerIt;
double length = calc(combined);
lengths.push_back(length);
}
// 将结果存入 resultMap
resultMap[key] = lengths;
}
// 输出处理前的 resultMap
for (std::map<std::string, std::vector<double>>::iterator it = resultMap.begin(); it != resultMap.end(); ++it) {
std::cout << "Key: " << it->first << std::endl;
for (std::vector<double>::iterator vecIt = it->second.begin(); vecIt != it->second.end(); ++vecIt) {
std::cout << " Value: " << *vecIt << std::endl;
}
}
// 处理 resultMap
processResultMap(resultMap);
// 输出处理后的 resultMap
for (std::map<std::string, std::vector<double>>::iterator it = resultMap.begin(); it != resultMap.end(); ++it)
{
std::cout << "Key: " << it->first << std::endl;
for (std::vector<double>::iterator vecIt = it->second.begin(); vecIt != it->second.end(); ++vecIt)
{
std::cout << " Value: " << *vecIt << std::endl;
}
}
return 0;
}
#endif
#if 0
#include <iostream>
#include <map>
#include <set>
#include <vector>
#include <string>
/*
std::map<std::string, std::set<std::string>> platTargetMap; platTargetMap["plat1"] = { "target1", "target2" }; platTargetMap["plat2"] = { "target1", "target2" };
我需要将platTargetMap中元素1中的set中的每一个元素分别依次和key相加,例如"plat1"+"target1",此处由函数名为calc的方法实现,返回值为相加后字符串的长度,类型为int,其余元素做同样的操作,并将对应结果存储到std::map<std::string, std::vector<double>> resultMap;
请使用迭代器实现,不要使用auto,并加上注释,请给platTargetMap多加几个元素,并且set中的字符串长度不要一样
*/
/*
* std::map<std::string, std::set<std::string>> platTargetMap; platTargetMap["plat1"] = { "target1", "target2" }; platTargetMap["plat2"] = { "target1", "target2" };
我需要将platTargetMap中元素1中的set中的每一个元素分别依次和key相加,例如"plat1"+"target1",此处由函数名为calc的方法实现,返回值为相加后字符串的长度,类型为int,其余元素做同样的操作,并将对应结果存储到std::map<std::string, std::vector<double>> resultMap; 请使用迭代器实现,不要使用auto,并加上注释,请给platTargetMap多加几个元素,并且set中的字符串长度不要一样。
在完成上面的步骤,我需要对resultMap进行处理,将resultMap中的第一个,第二个,第三个元素中的vector中的第一个元素进行比较,并找到vector中的最小值,其余的值减去最小值,最小值置为0,并存储在原来位置,resultMap中的第一个,第二个,第三个元素中的vector中的其他元素进行相同操作,请使用迭代器实现,不要使用auto,并加上注释
*/
// 定义 calc 方法,计算字符串的长度
int calc(const std::string& str) {
return static_cast<int>(str.length());
}
int main() {
// 定义 platTargetMap 并添加多个元素,set 中字符串长度不同
std::map<std::string, std::set<std::string>> platTargetMap;
platTargetMap["plat1"] = { "target1", "target2", "longertarget" };
platTargetMap["plat2"] = { "t1", "longerTargetHere" };
platTargetMap["plat3"] = { "short", "aBitLongerTarget" };
// 定义 resultMap,用于存储计算结果
std::map<std::string, std::vector<double>> resultMap;
// 定义 platTargetMap 的迭代器,用于遍历 platTargetMap
std::map<std::string, std::set<std::string>>::iterator platIt;
for (platIt = platTargetMap.begin(); platIt != platTargetMap.end(); ++platIt) {
// 获取当前的 key
const std::string& key = platIt->first;
// 获取当前 key 对应的 set
const std::set<std::string>& values = platIt->second;
// 定义一个向量,用于存储当前 key 与 set 中元素相加后的长度
std::vector<double> lengths;
// 定义 set 的迭代器,用于遍历当前 key 对应的 set
std::set<std::string>::iterator valueIt;
for (valueIt = values.begin(); valueIt != values.end(); ++valueIt) {
// 将 key 和 set 中的元素相加
std::string combined = key + *valueIt;
// 调用 calc 方法计算相加后字符串的长度
int length = calc(combined);
// 将长度添加到 lengths 向量中
lengths.push_back(static_cast<double>(length));
}
// 将 lengths 向量存储到 resultMap 中,键为当前的 key
resultMap[key] = lengths;
}
// 输出 resultMap
std::map<std::string, std::vector<double>>::iterator resultIt;
for (resultIt = resultMap.begin(); resultIt != resultMap.end(); ++resultIt) {
const std::string& key = resultIt->first;
const std::vector<double>& lengths = resultIt->second;
std::cout << "Key: " << key << std::endl;
std::vector<double>::const_iterator lengthIt;
for (lengthIt = lengths.begin(); lengthIt != lengths.end(); ++lengthIt) {
std::cout << " Length: " << *lengthIt << std::endl;
}
}
return 0;
}
#endif
假设我现在需要1s的采样数据,请帮我改写这段代码,在指令不变的前提下
最新发布