我可以在不推送的情况下向向量添加值吗?

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;