2

所以我有以下代码:

#include <iostream>
#include <vector>
#include <string>

using namespace std;

int main() {
    vector<string> strs;
    strs.push_back("happy");    
    const string& a1 = strs[0];
    strs.push_back("birthday");
    const string& a2 = strs[1];
    strs.push_back("dude");
    const string& a3 = strs[2];

    printf("%s\n", a1.c_str());     
    return 0;
}

这很简单,但它不起作用。printf不打印任何内容。如果我将其更改为:

const string& a1 = strs[0].c_str();

有人可以解释一下它的行为吗?

4

2 回答 2

8

push_back您对潜在(在您的情况下显然是实际上)的调用会使对 的所有引用无效vector,即如果vector太小而无法存储新元素。因此,除非您确保s 容量足够大,否则您不能在 a 之前使用任何对vector创建的引用。push_backvector

如果您在创建引用之前确保vector所有元素都有足够的容量(即使用std::vector::reserve) ,那么您的第一个版本将按预期工作。

您的第二个示例有效,因为您创建了一个新的、临时的string(其生命周期延长到引用的生命周期)引用绑定到。

于 2015-05-24T16:42:24.573 回答
1
strs.push_back("happy");    
const string& a1 = strs[0];

您的参考在这一点上是有效的。然而,以下 push_back 会产生问题

strs.push_back("birthday");

这将向量的容量从 1 增加到 2。由于新容量大于旧容量,因此在该向量上创建的所有引用(以及迭代器)都将失效。

作为旁注, c_str 为您提供 char* (\0 终止的字符串)。如果您的插入是形式

strs.push_back("happ\0y");
const string& a1 = strs[0].c_str();

a1 的值为 'happ'

于 2015-05-24T17:25:08.127 回答