我是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;
我是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;
不要放弃,比那更容易。
vector<string> v1(2);
v1[1] = "world";
v1[0] = "world";
cout << v1[1] << endl;
vector::insert
用于向 vector 中添加项,而不是替换已经存在的项。换言之,vector::insert
会改变 vector 的大小。
std::vector<std::string> v1(2, "HI");
- Mooing Duckvector
进行复制。这也很好。v1.resize(4, "HI");
- Mooing Duck首先,您需要将其调整大小以获得两个空字符串:
{"", ""}
然后您在 begin() + 1
或第二个元素之前插入"world"
:
{"", "world", ""}
然后在begin()
或第1个元素之前插入"world"
:
{"world", "", "world, ""}
使用 v1.at(1)
获取第二个元素,得到空字符串。
你很可能不想使用std::vector::insert
,因为它用于在现有元素之间插入新元素。你想像处理数组一样处理向量,使用operator[]
:
vector<string> v1(2);
v1[1] = "world";
v1[0] = "world";
cout << v1.at(1) << endl;
随机分配
只需使用索引(显然要验证它是否 < size
)
v1[index] = value;
随机插入(验证索引<size
)
v1.insert(v1.begin() + index, value);
要顺序在末尾插入/追加(无需索引,您的值将被插入向量末尾)
v1.push_back(value);
如果您计划插入许多值,请考虑在向矢量中调用reserve()
,以便足够的内存可以分配以存储所有项目,否则当您插入数据时,随着矢量增长,可能会出现许多重新分配。
v1.at(1)="world"
v1.at(0)="world"
--or--
v1[1] ="world"
v1[0] ="world"
这两种解决方案是等价的,但是第二种方案不会进行任何边界检查。如果出现越界错误,第一种方案将抛出错误。只要能保证不会索引越界,这就没关系了。
就像许多人所说的那样,如果你已经确定了向量的大小或填充了其他值,你可以使用 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