繁体   English   中英

矢量 push_back 添加新项目

[英]vector push_back add new items

我需要将项目添加到创建为std::vector<char*> Lista;的向量中。

然后我做:

char txt[10];
    for (int x = 0; x <= 5; x++)
    {
        
        sprintf(txt, "num%d", x);
        printf("Add %s\n", txt);

        Lista.push_back(txt);
    }

但是如果我循环显示它显示的 Lista 项目:

for (int x = 0; x <= Lista.size() - 1; x++)
    {
        printf("Items > [%d] %s\n", x, Lista[x]);
    }

项目 > [0] num5

项目 > [1] num5

项目 > [2] num5

项目 > [3] num5

项目 > [4] num5

项目 > [5] num5

我做错了什么? 我需要使用 char* 而不是字符串。

您将五个指向同一个数组的指针推入向量中,因此当您打印每个指针指向的数组内容时,它们都是相同的。

您只有一个数组: txt 每次通过循环时,您都会将新内容写入该数组并将指向它的指针推入Lista 所以第一次通过你的循环你有这个:

txt
┌─────┬─────┬─────┬─────┬──────┬─────┬─────┬─────┬─────┬─────┐
│     │     │     │     │      │     │     │     │     │     │
│ 'n' │ 'u' │ 'm' │ '0' │ '\0' │  ?  │  ?  │  ?  │  ?  │  ?  │
│     │     │     │     │      │     │     │     │     │     │
└─────┴─────┴─────┴─────┴──────┴─────┴─────┴─────┴─────┴─────┘
▲
│
└───┐
    │
┌───┼───┐
│   │   │
│   │   │
│       │
└───────┘
Lista

然后第二次通过你修改txt并将另一个指向它的指针添加到Lista ,所以你有这个:

txt
┌─────┬─────┬─────┬─────┬──────┬─────┬─────┬─────┬─────┬─────┐
│     │     │     │     │      │     │     │     │     │     │
│ 'n' │ 'u' │ 'm' │ '1' │ '\0' │  ?  │  ?  │  ?  │  ?  │  ?  │
│     │     │     │     │      │     │     │     │     │     │
└─────┴─────┴─────┴─────┴──────┴─────┴─────┴─────┴─────┴─────┘
▲ ▲
│ └─────────┐
└───┐       │
    │       │
┌───┼───┬───┼───┐
│   │   │   │   │
│   │   │   │   │
│       │       │
└───────┴───────┘
Lista

等等。 Lista的每个元素都包含一个指向同一数组的指针,您可以在循环的每次迭代中修改该数组。 当您返回并打印Lista的每个元素指向的数组内容时,它们都指向同一个数组,因此每个元素都会打印相同的内容。

如果要在Lista的每个元素中存储不同的文本,则需要为每个元素创建一个单独的字符串。 最简单的方法是将Lista的类型更改为std::vector<std::string>并让std::string类处理为每个字符串分配空间:

for (int x = 0; x <= 5; ++x) {
    std::string text = std::format(num{}, x);  // Use std::ostringstream or sprintf if your compiler doesn't support std::format
    Lista.push_back(text);
}

然后,您可以使用std::stringdata成员函数来获取指向字符串底层char*的指针,如果您需要将它传递给某些不支持std::string的接口。 请记住,这些指针指向的数组的生命周期与std::string对象的生命周期相关,因此请注意不要在std::string (或包含它的std::vector之后)使用它们) 超出范围。

如果您绝对不想使用std::string来管理数组的生命周期,您可以使用new[]自己分配它们,只需记住,您必须记住在使用完它们后delete[]它们避免内存泄漏:

for (int x = 0; x <= 5; ++x) {
    char* txt = new char[5];
    sprintf(txt, "num%d", x);
    Lista.push_back(txt);
}

// ... stuff

for (char* txt : Lista) {
    delete[] txt;
}

不过,这样做的正当理由很少。 在 99.9% 的情况下,您应该使用std::string或某种智能指针来管理您的内存。


注意:您的程序还表现出未定义的行为,因为您使用Lista[x+1] = txt访问数组越界; 你应该摆脱那条线。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM