在映射中初始化向量大小

3
在我的头文件中,我有一个映射字段:
std::map<std::string, std::vector<double>> priceSMA;

我知道这个向量的长度是50。我该如何设置这个向量的大小?
如果这个字段是一个独立的向量,那么设置大小就很简单。但是由于它嵌套在一个映射中,我不知道怎么办。
下面的代码会因为向量长度而抛出语法错误:
priceSMA = std::map<std::string, std::vector<double>(50)>();

感谢您的求助。

编辑

为了进一步澄清,prceSMA键将被填充一个货币标识符,例如"USD"。该向量用于存储此货币的最后50个值,其中每个值都有一个特定的时间戳。当填充完前50个值后,当我们跳到下一个时间戳时,向量中的所有当前值都会向右移动一个值,并将向量的最后(第50个)项目填充为当前时间戳的新值。

在移位之前,我计算向量中50个值的平均值,并将其存储在其他地方。

这个想法是获得一段时间内的简单移动平均值。


2
不清楚你所说的“向量”是什么意思。当您默认构造映射时,该映射没有任何条目。一旦您向映射中添加元素,向量(每个映射元素一个向量,而不是整个映射只有一个向量)可以具有任何大小。您是否真正寻找的是std::map<std::string,std::array<double,50>> - 463035818_is_not_a_number
1
你需要一个将字符串映射到固定大小为50的数组的映射表吗? - 463035818_is_not_a_number
我理解了,我是c++的新手,只使用过向量,刚刚快速查看了数组文档,这似乎符合我的需求。谢谢,我会尝试一下! - AlmostSober
如果您能澄清问题,我可以将注释转换为答案。请尝试解释priceSMA应该模拟什么。地图的元素是什么? - 463035818_is_not_a_number
1
只是一句旁白:我建议您再次确认您想要存储在向量中的值是否应为“double”。价格和货币汇率不能准确地表示为“double”类型的变量,这可能会在您的软件中引入错误。价格的滚动平均值在某些情况下可以是浮点值,但并非总是如此:如果它将用于推导另一个货币价值(例如从最近50个汇率计算出的平均汇率),那么它很可能应该使用能够保持小数值精度的数据类型进行建模。 - Maciek
3个回答

1
如果您确定大小将保持为50,则可以使用std :: map<std :: string,std :: array<double,50>>
否则,如果您使用vector,每次向地图添加元素时,您可以使用myMap [“newKey”] = std :: vector<double>(50, 0)来初始化具有50个元素且相等于0的向量。

吹毛求疵地说,您不能初始化由operator[]创建的元素。它已经被初始化过了,您只能对其进行赋值。最好调用resize函数。 - 463035818_is_not_a_number
myMap["newKey"].resize(50); - Remy Lebeau
为什么调用resize更好? - user6547518

0

这个:

priceSMA = std::map<std::string, std::vector<double>(50)>();

不正确,因为向量的大小不是其类型的一部分,但对于映射,第二个模板参数是mapped_value的类型。另外,您不需要显式调用默认构造函数。该映射已经默认构造:

std::map< key_type , mapped_value_type> priceSMA; // <- this is a default constructed map

这里不是只有一个向量,而是每个映射元素都有一个动态大小的向量。如果你真的想将字符串映射到固定大小的数组中,请看一下 std::array 并使用类似以下的代码:

struct foo {
     std::map<std::string,std::array<double,50>> priceSMA;
     foo() {} // constructor, no need to explicitly call the default constructor
};

由于std::map::operator[]在提供的键不存在时会插入元素,因此您可以像这样直接访问包含数组的元素:

int main(){
    foo f;
    f.priceSMA["blubb"][13] = 42;
}

-1
     map<ll, vector<int>> mp;

    for (int i = 1; i <= n; i++)
    {
        mp[i] = vector<int>(26);
    }

这对我有用!!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接