如何在C++中随机分配给vector?

Aly*_*Aly 13 c++ arrays vector

我是C++的新手,并且不断被告知使用std::vector而不是new[].

我试图实现这个功能,在那里我知道向量的大小,并希望随机分配给它(不是顺序).

但是,当运行它时,我的程序终止没有错误输出,所以我很难过.

vector<string> v1;
v1.resize(2);
v1.insert(v1.begin() + 1, "world");
v1.insert(v1.begin() + 0, "world");

cout << v1.at(1) << endl;
Run Code Online (Sandbox Code Playgroud)

joh*_*ohn 19

不要放弃,这比那更容易

vector<string> v1(2);
v1[1] = "world";
v1[0] = "world";

cout << v1[1] << endl;
Run Code Online (Sandbox Code Playgroud)

vector::insert是用于何时向向量中添加项目,而不是在想要替换已存在的项目时,vector::insert换句话说就是更改向量的大小.


Jos*_*eld 12

首先,您将其调整为两个空字符串:

{"", ""}
Run Code Online (Sandbox Code Playgroud)

然后插入"world"之前begin() + 1或第二个元素:

{"", "world", ""}
Run Code Online (Sandbox Code Playgroud)

然后插入"world"之前begin()或第一个元素:

{"world", "", "world, ""}
Run Code Online (Sandbox Code Playgroud)

然后使用v1.at(1)并访问第二个元素并获取空字符串.

据推测,您不希望std::vector::insert在现有元素之间插入新元素.您希望像使用数组一样执行此操作,其中operator[]:

vector<string> v1(2);
v1[1] = "world";
v1[0] = "world";
cout << v1.at(1) << endl;
Run Code Online (Sandbox Code Playgroud)


ema*_*tel 10

随机分配

只需使用索引(显然,验证它是< size)

v1[index] = value;
Run Code Online (Sandbox Code Playgroud)

随机插入(验证索引< size)

v1.insert(v1.begin() + index, value);
Run Code Online (Sandbox Code Playgroud)

在结尾/追加处顺序插入(不需要索引,您的值将插入到向量的末尾)

v1.push_back(value);
Run Code Online (Sandbox Code Playgroud)

如果您打算插入多个值,请考虑调用reserve()向量,以便可以分配足够的内存来存储所有项目,否则当您插入数据时,随着向量的增长,最终可能会有很多重新分配

  • +1,可能想要改写push_back来追加vs插入.对我来说,至少在语义和概念上看起来更准确 (2认同)

Dan*_*cci 6

您的程序运行正常.您的错误在您的代码逻辑中.

Insert不会更改存储在索引1处的字符串.它将字符串放在位置1,并将所有索引从1向右移动.

start               first insert            second insert 
("","")      ->   ("", "world, "")    ->  ("world","","world","")

因此,当您打印v1.at(1)时,您正在打印一个空字符串.

要解决此问题,您可能希望使用:

v1.at(1)="world"
v1.at(0)="world"
Run Code Online (Sandbox Code Playgroud)

- 要么 -

v1[1] ="world"
v1[0] ="world"
Run Code Online (Sandbox Code Playgroud)

这两个解决方案是等效的,但第二个解决方案不会进行任何边界检查.如果出现越界错误,第一个将抛出错误.只要你能保证你永远不会超出界限,这就无所谓了.