首页 > 解决方案 > 用向量的向量的元素初始化向量的空向量

问题描述

我有一个函数,它应该使用来自类型字符串的给定向量向量中的某些元素初始化来自字符串类型的空向量向量。我的语法看起来像这样

std::vector<std::vector<std::string>> extract_data_on_userid(const std::vector<std::vector<std::string>> &array, std::vector<std::string> &user_ids, const int nr_of_events)
{
  std::vector<std::vector<std::string>> data_extract;
  int event_iterator = 0;
  int user_id_iterator = 0;

  // While loops which extracts the events based on user IDs
  while (event_iterator <= nr_of_events)
  {
    // While loop which finds specified user id in an event
    while (user_id_iterator < array[0].size())
    {
      if (check_id(user_ids, array[0][user_id_iterator]))
      {
        for (size_t i = 0; i < array.size(); i++)
        {
          data_extract[i].push_back(array[i][user_id_iterator]);
        }
      }
      user_id_iterator++;
    }

    event_iterator++;
  }

  return data_extract;
}

给定的向量由不同数量的字符串向量组成(至少 2 个)。我的方法应在

check_id(user_ids, array[0][user_id_iterator])

然后将相关事件(user_id_iterator)推送到所有 1D 向量的新 2D 向量中

vector[i:in][user_id_iterator]

进入新发起的向量

std::vector<std::vector<std::string>> data_extract;

在 for 循环上。

 for (size_t i = 0; i < array.size(); i++)
    {
      data_extract[i].push_back(array[i][user_id_iterator]);
    }

在将 [user_id_iterator] 行中的向量 [i:in] 的元素推入 emtpy 向量之前,这一切都按预期工作。

我最初是否必须初始化 2D Vector data_extract 中的所有 1D 向量?填充向量的空向量的正确语法是什么,其中某些元素来自向量的填充向量?我收到异常(分段错误),因为 emtpy 向量未正确初始化。

标签: c++c++11vector

解决方案


你犯了一个简单的错误,很容易修复。

你的二维向量

std::vector<std::vector<std::string>> data_extract;

是空的,在定义之后。这意味着,它不包含任何元素,没有维度。甚至不是带有索引[0][0][0]. 因此,您遇到了段错误,因为您正在访问[i]不存在的元素。

所以,是的,正如你所假设的,你必须初始化向量。有几种可能性。您可以使用此处std::vector描述的构造函数设置初始大小。数字 3) 或 4)

例如:

std::vector<std::vector<std::string>> data_extract(array.size());

这可能是最合适的解决方案。

您也可以resize在定义后的向量

data_extract.resize(array.size());

但这是不需要的额外代码行,因为您可以在构造函数中执行此操作。如果您知道第二维的大小,您当然也可以初始化向量的两个维度。

std::vector<std::vector<std::string>> data_extract(array.size(),std::vector<std::string>(array[0].size(),""));

顺便一提。您的外部 while 循环是无操作的。

while (event_iterator <= nr_of_events)

“event_iterator”在循环体中没有使用,内部的while循环永远不会运行。这是因为在外循环的第二轮中,“user_id_iterator”已经比“array[0].size()”大,内循环将永远不会运行。

其余的逻辑也很难理解。我不确定,为什么你总是提到“array[0]”。


推荐阅读