13

我是 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;
4

5 回答 5

19

不要放弃,这比那更容易

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

cout << v1[1] << endl;

vector::insert用于当您想将项目添加到向量时,而不是当您想替换已经存在的项目时,vector::insert换句话说,会更改向量的大小。

于 2012-11-13T19:08:46.320 回答
12

首先,您调整它的大小以具有两个空字符串:

{"", ""}

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

{"", "world", ""}

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

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

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

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

vector<string> v1(2);
v1[1] = "world";
v1[0] = "world";
cout << v1.at(1) << endl;
于 2012-11-13T19:10:54.150 回答
10

随机分配

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

v1[index] = value;

随机插入(验证索引 < size

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

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

v1.push_back(value);

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

于 2012-11-13T19:15:44.320 回答
6

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

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

开始第一个插入 第二个插入
("","") -> ("", "world, "") -> ("world","","world","")

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

要解决此问题,您需要使用:

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

- 或者 -

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

这两种解决方案是等效的,但是第二种解决方案不会进行任何边界检查。如果存在越界错误,第一个将引发错误。只要您可以保证您永远不会索引越界,这无关紧要。

于 2012-11-13T19:20:44.647 回答
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

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

于 2012-11-14T02:24:14.663 回答