C++ 无法填充 C 数组的映射

Posted

技术标签:

【中文标题】C++ 无法填充 C 数组的映射【英文标题】:C++ Unable to populate a map of C arrays 【发布时间】:2011-12-28 16:09:33 【问题描述】:
typedef std::map<std::string,int> string2intMap;
typedef string2intMap arrOfMaps[3] ;

//map : string --> array of maps of <std::string,int>
std::map<std::string,arrOfMaps> tryingStuff;

//map : string --> int
string2intMap s;
s["key"]= 100;

tryingStuff["hello"][0] = s;

上面的代码无法编译,有问题的一行是: TryStuff[“你好”][0] = s;

这是编译器的呼喊:

c:\program files (x86)\microsoft visual studio 10.0\vc\include\map(215): error C2440: '<function-style-cast>' : cannot convert from 'int' to 'std::map<_Kty,_Ty> [3]'
2>          with
2>          [
2>              _Kty=std::string,
2>              _Ty=int
2>          ]
2>          There are no conversions to array types, although there are conversions to references or pointers to arrays
2>          c:\program files (x86)\microsoft visual studio 10.0\vc\include\map(210) : while compiling class template member function 'std::map<_Kty,_Ty> (&std::map<_Kty,arrOfMaps>::operator [](const std::basic_string<_Elem,_Traits,_Ax> &))[3]'
2>          with
2>          [
2>              _Kty=std::string,
2>              _Ty=int,
2>              _Elem=char,
2>              _Traits=std::char_traits<char>,
2>              _Ax=std::allocator<char>
2>          ]
2>          c:\work\toot\tootcode\tootim\tools\doobim\doobim.cpp(95) : see reference to class template instantiation 'std::map<_Kty,_Ty>' being compiled
2>          with
2>          [
2>              _Kty=std::string,
2>              _Ty=arrOfMaps
2>          ]
2>
2>Build FAILED.
2>
2>Time Elapsed 00:00:01.38
========== Build: 1 succeeded, 1 failed, 5 up-to-date, 0 skipped ==========

知道如何让它工作吗? (我不想改变数据结构 map : string --> 地图数组 )

【问题讨论】:

std::vector of an array的可能重复 【参考方案1】:

您不能将 C 样式的数组存储在容器中,因为它们不可赋值;你不能这样做:

int x[3] =  0, 1, 2 ;
int y[3] =  3, 4, 5 ;

x = y;

但容器需要能够分配/复制它们存储的元素。

考虑使用 std::vectorboost::array* 而不是原始 C 数组。


* 在 C++ 标准的最新版本中,可以使用 std::array 找到它。

【讨论】:

或者如果你有TR1,std::array【参考方案2】:

基本上数组是不可复制的。 您要使用的是矢量...

typedef std::map<std::string,int>  string2intMap;
typedef std::vector<string2intMap> arrOfMaps;

//map : string --> array of maps of <std::string,int>
std::map<std::string,arrOfMaps>    tryingStuff;

//map : string --> int
string2intMap s;
s["key"]= 100;

tryingStuff["hello"].push_back(s);

【讨论】:

以上是关于C++ 无法填充 C 数组的映射的主要内容,如果未能解决你的问题,请参考以下文章

我应该如何释放类型映射中为 argout 结构数组分配的内存?

是否有任何 C 或 C++ 标准识别内存映射文件的存在?

在 cython 的循环中创建 c++ 映射

C++ 将预先保留的哈希映射(std::unordered_map)与整数键和连续数据数组(std::vector)进行比较

字符串和成员函数指针的 C++ 映射

我们如何在 C++ 中的无序映射中分配变量并更新它们?