我可以在不推送的情况下向向量添加值吗?
Can I add a value to a vector without pushing it?
有什么方法可以创建这样的向量对
std::vector<std::pair<std::string, int>> myReg;
然后像这样添加:
myReg[0].first = "title of the movie";
myReg[0].second = 1968;
myReg[1].first = "title of the 2nd movie";
myReg[1].second = 2008;
因为它给了我一个
Debug assertion Failed
不使用这个:
myReg.push_back(std::pair<std::string, int>("title of the movie", 1968));
对于您显示的确切代码片段,您必须先执行 myReg.resize(2)
:
std::vector<std::pair<std::string, int>> myReg;
myReg.resize(2);
myReg[0].first = "title of the movie";
您也可以将 std::vector<...> myReg;
更改为 myReg(2);
:
std::vector<std::pair<std::string, int>> myReg(2);
myReg[0].first = "title of the movie";
如评论中所述,另一种选择是使用 std::map<>
而不是 vector<>
;这为您提供了 "auto expand"(不调用 push_back()
),但通常不如 vector<>
方便,因为内存不连续。该代码看起来像
std::map<int, std::pair<std::string, int>> myReg;
myReg[0].first = "title of the movie";
您也可以使用 operator []
(和 at()
)创建自己的 vector-like class 来自动增长向量;这很快就会变得混乱,你的同事可能会不赞成,但这是(不一定推荐)的想法:
template<typename T>
class my_vector
{
std::vector<T> v;
public:
T& operator[](size_t i) {
if (i >= v.size())
v.resize(i+1);
return v[i];
}
// ... a lot of other methods copied from std::vector<> ...
};
my_vector<std::pair<std::string, int>> myReg;
myReg[0].first = "title of the movie";
使用初始化列表:
std::vector<std::pair<std::string, int>> myReg{
{"title of the movie", 1968},
{"title of the 2nd movie", 2008}
};
如果以后需要补充,还是很简单的:
myReg.push_back({"title 3", 2000});
myReg.emplace_back("title 4", 2001);
感谢大家的帮助。这里的好人有很多想法。
好的,这是来自@Dan 的一个选项,尽管我正在考虑使用 class 或@chris 的方法
std::vector<std::pair<std::string, int>> myReg(1);
myReg[0].first = "title of the movie";
myReg[0].second = 1968;
myReg.resize(2);
myReg[1].first = "title of the 2nd movie";
myReg[1].second = 2008;
你有两种通用方式:
首先,你可以使用vector的构造函数:
矢量 (initializer_list il,
const allocator_type& alloc = allocator_type());
std::vector<std::pair<std::string, int>> myReg(2);
myReg[0].first = "title of the movie";
myReg[0].second = 1968;
myReg[1].first = "title of the 2nd movie";
myReg[1].second = 2008;
显式向量(size_type n, const value_type& val = value_type(),
const allocator_type& alloc = allocator_type());
std::vector<std::pair<std::string, int>> myReg{
{"title of the movie", 1968},
{"title of the 2nd movie", 2008}
};
或在启动前调整向量大小:
std::vector<std::pair<std::string, int>> myReg;
myReg.resize(2)
myReg[0].first = "title of the movie";
myReg[0].second = 1968;
myReg[1].first = "title of the 2nd movie";
myReg[1].second = 2008;
有什么方法可以创建这样的向量对
std::vector<std::pair<std::string, int>> myReg;
然后像这样添加:
myReg[0].first = "title of the movie";
myReg[0].second = 1968;
myReg[1].first = "title of the 2nd movie";
myReg[1].second = 2008;
因为它给了我一个
Debug assertion Failed
不使用这个:
myReg.push_back(std::pair<std::string, int>("title of the movie", 1968));
对于您显示的确切代码片段,您必须先执行 myReg.resize(2)
:
std::vector<std::pair<std::string, int>> myReg;
myReg.resize(2);
myReg[0].first = "title of the movie";
您也可以将 std::vector<...> myReg;
更改为 myReg(2);
:
std::vector<std::pair<std::string, int>> myReg(2);
myReg[0].first = "title of the movie";
如评论中所述,另一种选择是使用 std::map<>
而不是 vector<>
;这为您提供了 "auto expand"(不调用 push_back()
),但通常不如 vector<>
方便,因为内存不连续。该代码看起来像
std::map<int, std::pair<std::string, int>> myReg;
myReg[0].first = "title of the movie";
您也可以使用 operator []
(和 at()
)创建自己的 vector-like class 来自动增长向量;这很快就会变得混乱,你的同事可能会不赞成,但这是(不一定推荐)的想法:
template<typename T>
class my_vector
{
std::vector<T> v;
public:
T& operator[](size_t i) {
if (i >= v.size())
v.resize(i+1);
return v[i];
}
// ... a lot of other methods copied from std::vector<> ...
};
my_vector<std::pair<std::string, int>> myReg;
myReg[0].first = "title of the movie";
使用初始化列表:
std::vector<std::pair<std::string, int>> myReg{
{"title of the movie", 1968},
{"title of the 2nd movie", 2008}
};
如果以后需要补充,还是很简单的:
myReg.push_back({"title 3", 2000});
myReg.emplace_back("title 4", 2001);
感谢大家的帮助。这里的好人有很多想法。
好的,这是来自@Dan 的一个选项,尽管我正在考虑使用 class 或@chris 的方法
std::vector<std::pair<std::string, int>> myReg(1);
myReg[0].first = "title of the movie";
myReg[0].second = 1968;
myReg.resize(2);
myReg[1].first = "title of the 2nd movie";
myReg[1].second = 2008;
你有两种通用方式:
首先,你可以使用vector的构造函数:
矢量 (initializer_list il, const allocator_type& alloc = allocator_type());
std::vector<std::pair<std::string, int>> myReg(2);
myReg[0].first = "title of the movie";
myReg[0].second = 1968;
myReg[1].first = "title of the 2nd movie";
myReg[1].second = 2008;
显式向量(size_type n, const value_type& val = value_type(), const allocator_type& alloc = allocator_type());
std::vector<std::pair<std::string, int>> myReg{
{"title of the movie", 1968},
{"title of the 2nd movie", 2008}
};
或在启动前调整向量大小:
std::vector<std::pair<std::string, int>> myReg;
myReg.resize(2)
myReg[0].first = "title of the movie";
myReg[0].second = 1968;
myReg[1].first = "title of the 2nd movie";
myReg[1].second = 2008;