我有一个函数,该函数应使用来自字符串类型的给定 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/