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

时间:2012-11-13 19:06:45

标签: 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;

5 个答案:

答案 0 :(得分:19)

不要放弃,这比那更容易

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

cout << v1[1] << endl;

vector::insert适用于您想要向向量添加项目的情况,而不是当您想要替换已存在的项目时,vector::insert会改变向量的大小。换句话说。

答案 1 :(得分:12)

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

{"", ""}

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

{"", "world", ""}

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

{"world", "", "world, ""}

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

据推测,您不希望std::vector::insert在现有元素之间插入新元素。您希望像使用operator[]

的数组一样执行此操作
vector<string> v1(2);
v1[1] = "world";
v1[0] = "world";
cout << v1.at(1) << endl;

答案 2 :(得分:10)

随机分配

只需使用索引(显然,验证它是&lt; size

v1[index] = value;

随机插入(验证索引&lt; size

v1.insert(v1.begin() + index, value);

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

v1.push_back(value);

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

答案 3 :(得分:6)

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

插入不会更改存储在索引1处的字符串。它会将字符串放在位置1,并将所有索引从1移到右侧。

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

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

要解决此问题,您可以使用:

v1.at(1)="world"
v1.at(0)="world"

- 或 -

v1[1] ="world"
v1[0] ="world"

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

答案 4 :(得分:2)

正如许多人所说,你可以使用operator[]来重新分配旧值,因为你已经调整了矢量大小或用其他值填充了它。 如果你的数组总是有一个固定的大小,你可以使用std::array,这可以提高性能,同时牺牲在运行时调整数组大小或确定其大小的能力。

std::array<std::string,2> a1;
a1[0] = "world";
a1[1] = "world2";
std::cout<<a1.at(1)<<std::endl; //outputs world2

请注意,大小必须是静态的,因此您不能执行以下操作:

int numStrings;
std::cin>>numStrings;
std::array<std::string,numStrings> a2; //ERROR

不幸的是,除了使用初始化列表之外,我认为没有任何方法可以在没有默认构造函数的情况下初始化std::array

struct T
{
   T(std::string s):str(s){} //no default constructor
   std::string str;
}
std::array<T,2> a3 = {T(""), ""}; //you can use a conversion constructor implicitly

显然,如果你想要一个包含大量对象的数组,这是不切实际的。