string :: assign在字符串向量中不起作用

时间:2016-04-08 13:07:12

标签: c++

为什么这个程序崩溃了?它在vec[0].assign("blabla");行崩溃:

#include <vector>
#include <string>
using namespace std;

int main()
{
     vector<string> vec;
     vec.reserve(5);
     vec[0].assign("blabla");
}

或者这个:

#include <vector>
#include <string>
using namespace std;

int main()
{
    vector<string> vec;
    vec.reserve(5);
    vec[0].push_back('a');
}

最好使用什么而不是它真的不起作用?

1 个答案:

答案 0 :(得分:1)

vector<string> vec;
vec.reserve(5);
vec[0].assign("blabla");

这会导致未定义的行为。 vec[0]已被保留但未分配。你应该使用push或emplace代替。

vector<string> vec;
vec.reserve(5);
vec[0].push_back('a');

同样的错误。您正在推送到目前尚不存在的vec[0]

<强>解决方案:

vector<string> vec;
vec.reserve(5);
vec.emplace_back("blabla"); //or push_back

或者:

vector<string> vec;
vec.resize(5);// Notice resize not reserve
vec[0].assign("blabla");//this works now since vec[0] is exist

或者:

vector<string> vec;
vec.resize(5);// Notice resize not reserve
vec[0].push_back('b'); //this works now since vec[0] is exist

NOT 更喜欢第二个选项,因为它导致构造N次然后分配N次