我是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;
答案 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
显然,如果你想要一个包含大量对象的数组,这是不切实际的。