c++ - 用 vector 的 vector 的元素初始化 vector 的空 vector

标签 c++ c++11 vector

我有一个函数,该函数应使用来自字符串类型的给定 vector vector 中的某些元素初始化来自字符串类型的空 vector 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 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;
}

给定的 vector 由不同数量的字符串 vector 组成(至少 2 个)。我的方法应在
check_id(user_ids, array[0][user_id_iterator])

然后将相关事件(user_id_iterator)推送到所有 1D vector 的新 2D vector 中
vector[i:in][user_id_iterator]

进入新发起的 vector
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] 行中的 vector [i:in] 的元素被插入 emtpy vector 中。

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

最佳答案

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

std::vector<std::vector<std::string>> data_extract;
是空的,在定义之后。这意味着它不包含任何元素,没有维度。甚至不是索引为 [0] 的元素或 [0][0] .因此,您遇到了段错误,因为您正在访问元素 [i] ,这是不存在的。
所以,是的,正如你所假设的,你必须初始化 vector 。有几种可能性。您可以使用 std::vector 设置初始大小构造函数描述here .数字 3) 或 4)
例如:
std::vector<std::vector<std::string>> data_extract(array.size());
这可能是最合适的解决方案。
您也可以resize定义后的 vector
data_extract.resize(array.size());
但这是额外的代码行,不需要,因为您可以在构造函数中执行此操作。如果您知道第二个维度的大小,您当然也可以初始化 vector 的两个维度。
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] .

关于c++ - 用 vector 的 vector 的元素初始化 vector 的空 vector ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60109573/

相关文章:

c++ - 如何生成和使用带有 new 的 c++11 std::array 以使用堆而不是堆栈?

c++ - 函数返回迭代器到 vector

C++ 编辑文本文件

c++ - 在整个函数中保持相同的 vector 以进行添加和删除

c++ - 为什么只能从信号处理程序安全地调用异步信号安全函数?

c++ - 如何使用取决于模板参数的字符类型定义字符串文字?

c++插入空 vector 不能使用大括号

c++ - C代码仍然被认为是C++吗?

c++ - 我可以在 Windows 98 上运行在 Visual Studio 2005 中编译的应用程序吗?

c++ - 使用精神以替代方式解析结构时混淆输出