Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/126.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 从匿名命名空间抛出std::bad_alloc将值分配到映射_C++_Stdmap - Fatal编程技术网

C++ 从匿名命名空间抛出std::bad_alloc将值分配到映射

C++ 从匿名命名空间抛出std::bad_alloc将值分配到映射,c++,stdmap,C++,Stdmap,下面是通过错误代码std::bad_alloc。我犯了一个错误 行obj_j[key[i]=value[i]。请帮我修一下 #include<iostream> #include<map> using namespace std; namespace { const std::string key1 = "s1"; const std::string key2 = "s2"; const std::str

下面是通过错误代码std::bad_alloc。我犯了一个错误 行obj_j[key[i]=value[i]。请帮我修一下

 #include<iostream>
 #include<map>
  using namespace std;

 namespace {
         const std::string key1 = "s1";
         const std::string key2 = "s2";

         const std::string value1 = "v1";
         const std::string value2= "v2";
 }

 int main()
 {

         std::string key[3] = {
                 key1, key2};
          std::string value[3] = {
                  value1,value2 };
         std::map<std::string,std::string> obj_;

         for (size_t i = 0; i < sizeof(key); ++i) { // here its thow std::bad_alloc
                 obj_[key[i]] = value[i];
            }
}
#包括
#包括
使用名称空间std;
名称空间{
const std::string key1=“s1”;
const std::string key2=“s2”;
const std::string value1=“v1”;
const std::string value2=“v2”;
}
int main()
{
std::字符串键[3]={
键1,键2};
标准::字符串值[3]={
value1,value2};
标准::映射对象;
对于(size_t i=0;i
sizeof(key)
是数组的大小,以字节为单位。这不是元素的数量

相反,您应该使用
std::extent\u v
。(需要
#包括

C++17之前版本的备选方案:
std::extent::value
。(需要
#也包括

如果这对你来说太花哨了,有一个穷人的选择:
sizeof(key)/sizeof(key[0])

或者只需硬编码
3

sizeof(键)
=96(在操作系统64位上)。要获得数组的大小,必须将该数字除以sizeof(std::string)
(在os 64位上为32):

for(size_t i=0;i
不要在此处使用
sizeof(键)

for (size_t i = 0; i <  sizeof(key); ++i) { // here its thow std::bad_alloc
        obj_[key[i]] = value[i];
    }
当您使用
sizeof()
时,它返回的是对象的数量,而不是您期望的元素数量。此外,当使用操作符
[]
时,您可以直接访问阵列中的封装数据,而这种组合可能是您的错误源。计算出你有多少元素

因为您以前知道数组大小,所以可以使用
std::array

std::array<std::string,3> key = {key1, key2, ""}; //you only used two values in your code
for (size_t i = 0; i < key.size(); ++i) {
  //your instructions
}
std::数组键={key1,key2,“}//您在代码中只使用了两个值
对于(size_t i=0;i

有点奇怪,即使显式设置数组的大小,您仍然需要在循环中查询它的大小。假设这是问题陈述的一个意外特性,并且您事先不知道它的大小,我建议您使用std::vector。

请注意,
key
value
分别包含3个元素,但您只初始化其中的两个。您可能会被需要额外元素来存储空终止符的c字符串弄糊涂。
sizeof(key)
不是3,而是
sizeof(std::string)*3
。这说明了什么:
std::cout@FrançoisAndrieux我根据您的建议进行了更改,但结果仍然相同。在抛出“std::length\u error”what():basic\u string::\u M\u create Aborted(内核转储)preference
std::array
及其
size
member function.Nope的实例后终止调用。它将给出第一个字符串的长度,而不是数组。
key.size()
key.length()
不会编译<代码>键
是一个数组。你说得对,我错过了。答案是编辑好的,现在应该可以了。你能不能用下面的建议给出给出尺寸的示例代码。相反,您应该使用std::extent\u v。(需要#include。)@josp您只需将
sizeof(key)
替换为
std::extent\u v
。并在文件顶部添加
#include
。下面的错误是throw:mapex.cc:在函数'int main()':mapex.cc:23:25:error:'extent_v'不是(size_t i=0;i-std=C++17
。如果该标志不起作用,则表示编译器太旧。请更新它,或尝试其他两个选项。
for (size_t i = 0; i <  (sizeof(key)/sizeof(*key)); ++i) { // here its thow std::bad_alloc
        obj_[key[i]] = value[i];
    }
std::array<std::string,3> key = {key1, key2, ""}; //you only used two values in your code
for (size_t i = 0; i < key.size(); ++i) {
  //your instructions
}