计算向量的 std::map 的值作为键并作为值的两倍?

Posted

技术标签:

【中文标题】计算向量的 std::map 的值作为键并作为值的两倍?【英文标题】:Computing the values of a std::map of vector as the key and double as the value? 【发布时间】:2018-03-29 05:58:46 【问题描述】:
 std::map<std::vector<double>, double> MyMethod(std::map<std::vector<double>, double> mappingSourceToTarget, int radius)

    std::map<std::vector<double>, double> mappingSourceToTargetNew(mappingSourceToTarget);
    std::map<std::vector<double>, double>::iterator it_trgt,it_src;
    double sumOfNormals1 = 0;
    int size = mappingSourceToTarget.size(), i=0;
    for (it_src = mappingSourceToTarget.begin(), it_trgt = mappingSourceToTargetNew.begin(); i < size + (radius * 2) ; i++, it_src, it_trgt++)
    
        auto elem = mappingSourceToTargetNew;

        if (i == 0)
        
            //it_trgt->first.at(i % size) = it_src->first.at(i%size);

            mappingSourceToTargetNew.at(i % size) = mappingSourceToTarget.at(i % size);
            sumOfNormals1 += mappingSourceToTarget.at(i % size);

在这里我遇到了麻烦,关于如何将值从一张地图放到另一张地图。

我使用的是循环数组的概念,所以这里使用的是 i%size, 向量是坐标,双精度是该点的强度值。

索引的东西不能用.at(),我真的不知道该怎么办

我必须仅使用地图(任务)使其工作。

在索引处将值从一个映射复制到另一个映射 (i%size)

【问题讨论】:

阅读How to Ask和minimal reproducible example 我认为您发布的代码方向错误。它的某些部分没有什么意义。我认为这是一个 XY 问题(请参阅 meta.stackexchange.com/questions/66377/what-is-the-xy-problem)。因此,如果您可以解释您希望该函数做什么,那么有人可能会提供帮助。 映射中的键类型是std::vector&lt;double&gt;,因此at() 成员函数需要that 作为参数,而不是int。最重要的是,将浮点值作为键会使代码变得非常微妙,因为 15 位小数的差异会产生不同的键。 MovingAverage 函数是我想要的,如果有任何其他方法可以做到这一点,请回复.. 这张地图的 Value 内的数据是我想要通过移动平均线的数据算法并将其存储在我的地图中。 【参考方案1】:

1) 使用迭代器读取键值,即使用 first/second。

2) 当迭代器到达末尾时,设置它等于 begin()。这将像i % size

这里有一些示例代码来展示这个想法:

#include <iostream>
#include <map>

int main() 
    std::map<int, int> m 1, 100, 2, 200;
    auto s = m.size();
    std::cout << "size = " << s << std::endl;
    auto i1 = m.begin();
    auto i2 = m.end();
    for (auto i = 0; i < 5; ++i)
    
        std::cout << "key=" << i1->first << " value=" << i1->second << std::endl;
        ++i1;
        if (i1 == i2)
        
            // We reached the end so go back to the begining
            i1 = m.begin();
        
    
    return 0;

输出:

size = 2
key=1 value=100
key=2 value=200
key=1 value=100
key=2 value=200
key=1 value=100

【讨论】:

但是在这里我必须从一张地图复制到另一张地图。 循环一直持续到 i @NamanSharma 此处的代码只是向您展示如何以循环方式访问键值。正如您自己注意到的那样,.at(i%size) 无法做到这一点,但您可以像发布的代码一样做到这一点。您想对键值对做什么取决于您。复制到另一张地图没有问题。 顺便说一句:我不明白你想通过以循环方式复制到地图中来实现什么。一个特定的键只能在地图中出现一次。 更进一步:在您的代码中,您已经在这一行复制了一份:std::map&lt;std::vector&lt;double&gt;, double&gt; mappingSourceToTargetNew(mappingSourceToTarget);

以上是关于计算向量的 std::map 的值作为键并作为值的两倍?的主要内容,如果未能解决你的问题,请参考以下文章

如何根据其值的属性对地图进行排序?

使用std shared_ptr作为std :: map键

将 std::map 转换为有序的 std::vector

std::map 作为类成员

使用 std::string 作为 std::map 的键

计算向量中存储的值的中位数 - C++?