C++ 使用向量的向量元素初始化向量的空向量

C++ 使用向量的向量元素初始化向量的空向量,c++,c++11,vector,C++,C++11,Vector,我有一个函数,它将初始化字符串类型的向量的空向量,并使用字符串类型的向量的给定向量中的某些元素。我的语法是这样的 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

我有一个函数,它将初始化字符串类型的向量的空向量,并使用字符串类型的向量的给定向量中的某些元素。我的语法是这样的

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;
}
然后将相关事件(用户id迭代器)推送到所有1D向量的新2D向量中

vector[i:in][user_id_iterator]
进入新启动的向量

std::vector<std::vector<std::string>> data_extract;
std::矢量数据提取;
越过for循环

 for (size_t i = 0; i < array.size(); i++)
    {
      data_extract[i].push_back(array[i][user_id_iterator]);
    }
for(size_t i=0;i
在将第[user_id_iterator]行中的向量[i:in]的元素推入emtpy向量之前,它都会按预期工作

我是否必须初始化2D矢量数据提取中的所有1D矢量?填充向量的空向量时,正确的语法是什么?
我收到一个异常(分段错误),因为emtpy向量没有正确初始化

您的分段错误很难找到,因为您实现功能的方式太复杂了。有一些简单的重构措施可以减少此处产生的噪音:

调用字符串向量的向量数组确实令人恼火。相反,请尝试重命名并使用别名(不完全了解您的上下文):

您的内部
while
可以替换为基于范围的for循环,因此您不需要跟踪另一个int迭代器:

// Loop which finds specified user id in an event
for (const auto& userIdsOfEvent : eventsOfUserIds[0])
{
    if (check_id(user_ids, userIdsOfEvent))
    {
       for (size_t i = 0; i < eventsOfUserIds.size(); i++)
       {
          data_extract[i].push_back(userIdsOfEvent);
       }
    }
}
您正在使用迭代器
i
访问
数据提取
,但数据提取尚未在D1级别初始化。为此,您可以按如下方式构造它:

TUserIdEvents data_extract(eventsOfUserIds.size());

这会在数据提取中创建大量子向量,等于作为参数传递的子向量的数量。

您的分段错误很难找到,因为您的函数实现方式太复杂。有一些简单的重构措施可以减少此处产生的噪音:

调用字符串向量的向量数组确实令人恼火。相反,请尝试重命名并使用别名(不完全了解您的上下文):

您的内部
while
可以替换为基于范围的for循环,因此您不需要跟踪另一个int迭代器:

// Loop which finds specified user id in an event
for (const auto& userIdsOfEvent : eventsOfUserIds[0])
{
    if (check_id(user_ids, userIdsOfEvent))
    {
       for (size_t i = 0; i < eventsOfUserIds.size(); i++)
       {
          data_extract[i].push_back(userIdsOfEvent);
       }
    }
}
您正在使用迭代器
i
访问
数据提取
,但数据提取尚未在D1级别初始化。为此,您可以按如下方式构造它:

TUserIdEvents data_extract(eventsOfUserIds.size());

这将在data_extract中创建一个子向量量,等于作为参数传递的子向量量。

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

你的二维向量

std::vector<std::vector<std::string>> data_extract;
这可能是最合适的解决方案

您还可以在定义后调整向量的大小

data_extract.resize(array.size());
但这是一行额外的代码,不需要,因为您可以在构造函数中执行。当然,如果知道第二维度的大小,也可以初始化向量的两个维度

std::vector<std::vector<std::string>> data_extract(array.size(),std::vector<std::string>(array[0].size(),""));
std::vector数据\u提取(array.size(),std::vector(array[0].size(),“”);
顺便说一下。您的外部while循环是不可操作的

while (event_iterator <= nr_of_events)

while(event_iterator您犯了一个简单的错误,很容易修复

你的二维向量

std::vector<std::vector<std::string>> data_extract;
这可能是最合适的解决方案

您还可以在定义后调整向量的大小

data_extract.resize(array.size());
但这是一行额外的代码,不需要,因为你可以在构造函数中完成。当然,你也可以初始化向量的两个维度,如果你知道第二个维度的大小的话

std::vector<std::vector<std::string>> data_extract(array.size(),std::vector<std::string>(array[0].size(),""));
std::vector数据\u提取(array.size(),std::vector(array[0].size(),“”);
顺便说一句,你的外while循环是禁止的

while (event_iterator <= nr_of_events)

while(event\u iterator)此函数有点凌乱。请尝试使用更多STL函数。我很确定您可以将
user\u id\u iterator
-循环替换为类似以下内容:
user\u id\u it=std::find()
。此函数有点凌乱。请尝试使用更多STL函数。我确信您可以将
user\u id\u迭代器
-循环替换为类似以下内容:
user\u id\u it=std::find()