如何使用std::vector.insert()?
How to use std::vector.insert()?
所以,我正在尝试学习如何使用 std::vectors
,但我遇到了一个问题:
std::vector<Box>entities;
entities.insert(1, Box(&world, b2Vec2(Camera.getCenter().x, Camera.getCenter().y), b2Vec2(25, 25), 0, sf::Color::Red, b2_dynamicBody, 1.0f, 0.3));
怎么不行?它给了我以下错误:
Error no instace of overloaded function "std::vector<_Ty, _alloc>::insert [with _Ty=Box, _Alloc=std::allocator<Box>] matches the argument list. Argument types are (int, Box). Object type is std::vector<Box, std::allocator<Box>>
我做错了什么?
第一个参数错误。您应该指定一个迭代器,而不是索引。
entities.insert(entities.begin() + i, theItem);
其中 i
是您要插入的位置。请注意,向量的大小必须至少为 i
.
第一个参数应该是迭代器,而不是索引。您可以使用 entities.begin() + 1
.
将迭代器定位到位置 1
请注意,位置 1 是向量中 第二个 元素的位置:向量索引是 从零开始的 .
entities.insert(entities.begin(), /*other stuff as before*/
会插入到向量的开头。 (即 第零 元素)。请记住,vector
索引是从零开始的。
entities.insert(1 + entities.begin(), /*other stuff as before*/
将在 第二个 位置插入。
方法 insert
的所有重载版本都要求第一个参数的类型 std::vector<Box>::const_iterator
应用于向量定义。此迭代器指定必须插入新元素的位置。
但是您传递的是整数值 1 而不是迭代器
entities.insert(1,
^^^
Box(&world, b2Vec2(Camera.getCenter().x, Camera.getCenter().y),
b2Vec2(25, 25), 0, sf::Color::Red, b2_dynamicBody, 1.0f, 0.3));
没有从类型 int
的对象到类型 std::vector<Box>::const_iterator
的对象的隐式转换。所以编译器报错。
也许你的意思是以下
#include <vector>
#include <iterator>
//...
entities.insert( std::next( entities.begin() ),
^^^^^^^^^^^^^^^^^^^^^^^^^^^
Box(&world, b2Vec2(Camera.getCenter().x, Camera.getCenter().y),
b2Vec2(25, 25), 0, sf::Color::Red, b2_dynamicBody, 1.0f, 0.3));
或者如果你的编译器不支持函数std::next
那么你可以只写
entities.insert( entities.begin() + 1,
^^^^^^^^^^^^^^^^^^^^^
Box(&world, b2Vec2(Camera.getCenter().x, Camera.getCenter().y),
b2Vec2(25, 25), 0, sf::Color::Red, b2_dynamicBody, 1.0f, 0.3));
所以,我正在尝试学习如何使用 std::vectors
,但我遇到了一个问题:
std::vector<Box>entities;
entities.insert(1, Box(&world, b2Vec2(Camera.getCenter().x, Camera.getCenter().y), b2Vec2(25, 25), 0, sf::Color::Red, b2_dynamicBody, 1.0f, 0.3));
怎么不行?它给了我以下错误:
Error no instace of overloaded function "std::vector<_Ty, _alloc>::insert [with _Ty=Box, _Alloc=std::allocator<Box>] matches the argument list. Argument types are (int, Box). Object type is std::vector<Box, std::allocator<Box>>
我做错了什么?
第一个参数错误。您应该指定一个迭代器,而不是索引。
entities.insert(entities.begin() + i, theItem);
其中 i
是您要插入的位置。请注意,向量的大小必须至少为 i
.
第一个参数应该是迭代器,而不是索引。您可以使用 entities.begin() + 1
.
请注意,位置 1 是向量中 第二个 元素的位置:向量索引是 从零开始的 .
entities.insert(entities.begin(), /*other stuff as before*/
会插入到向量的开头。 (即 第零 元素)。请记住,vector
索引是从零开始的。
entities.insert(1 + entities.begin(), /*other stuff as before*/
将在 第二个 位置插入。
方法 insert
的所有重载版本都要求第一个参数的类型 std::vector<Box>::const_iterator
应用于向量定义。此迭代器指定必须插入新元素的位置。
但是您传递的是整数值 1 而不是迭代器
entities.insert(1,
^^^
Box(&world, b2Vec2(Camera.getCenter().x, Camera.getCenter().y),
b2Vec2(25, 25), 0, sf::Color::Red, b2_dynamicBody, 1.0f, 0.3));
没有从类型 int
的对象到类型 std::vector<Box>::const_iterator
的对象的隐式转换。所以编译器报错。
也许你的意思是以下
#include <vector>
#include <iterator>
//...
entities.insert( std::next( entities.begin() ),
^^^^^^^^^^^^^^^^^^^^^^^^^^^
Box(&world, b2Vec2(Camera.getCenter().x, Camera.getCenter().y),
b2Vec2(25, 25), 0, sf::Color::Red, b2_dynamicBody, 1.0f, 0.3));
或者如果你的编译器不支持函数std::next
那么你可以只写
entities.insert( entities.begin() + 1,
^^^^^^^^^^^^^^^^^^^^^
Box(&world, b2Vec2(Camera.getCenter().x, Camera.getCenter().y),
b2Vec2(25, 25), 0, sf::Color::Red, b2_dynamicBody, 1.0f, 0.3));