如何避免将向量kws的全部值复制到下面的req_kws (向量的向量)中,同时在代码中保留两个容器kws和req_kws?
vector<vector<string>> req_kws;
for (string& request : requests) {
vector<string>& kws = req_kws.back(); //<-- define &kws to empty req_kws
kws = split(kwsStr, ","); //split is a parsing function upon string kwsStr
req_kws.push_back(kws);
}我用的是3号线
vector<string>& kws = req_kws.back();这样,没有存储kws向量的所有值,而只是将其引用存储到req_kws中。
但是,我在运行时得到了一个分段错误。有办法解决吗?
谢谢你的帮助。
附加说明;
请注意我上面提到的约束,我需要保持第4行( kws )和第5行( req_kws )的完整,并且希望使用引用(&)的第3行或类似的东西来从存储到kws和req_kws的相同值中节省执行时间。我有代码的其他部分与相同的问题,这是更复杂的,所以我不能简单地将两行4和5合并为一。
补充问题(类似问题):
感谢您在下面的解决方案。但是,下面的情况如何,它类似于上面的情况,但更复杂。
vector<unordered_map<string, string>> ads_kwsBids;
for (const auto& kwBid : kwsBids) {
…
unordered_map<string, string>& kwsBidsMap = ads_kwsBids.back(); //to prevent from being whole container copied
for (unsigned j = 0; j < nsize; j++) {
unsigned jdx = 2 * j;
kwsBidsMap[splitedStr[jdx]] = splitedStr[jdx + 1];// constructing map kwsBidsMap
}
ads_kwsBids.push_back(kwsBidsMap);
}在第四行,就是,
unordered_map<string, string>& kwsBidsMap = ads_kwsBids.back();由于参考&的存在,产生了分割故障。但是,引用也是防止kwsBidMap被复制到ads_kwsBids中的引用。是否仍有一种方法可以在kwsBidMap上使用引用kwsBidMap而不获取分割错误?
发布于 2020-05-29 01:25:44
在所示的代码中,req_kws是一个空向量。对空向量调用back()是未定义的行为。您需要先向向量添加一个元素,或者重写代码以不依赖于有一个值。
据我所知,你想做的事情,我觉得很简单
req_kws.push_back(split(request, ","));应该就够了。
或者,您可以将循环重写为
for (string& request : requests) {
req_kws.push_back(split(request, ","));
vector<string>& kws = req_kws.back();
}这将拆分请求字符串,将其存储在req_kws向量中,然后创建对新添加的元素的kws引用。根据您对其所做的其他操作,您可能需要在for循环之前添加req_kws.reserve(requests.size());,以避免在向向量添加时重新分配。
https://stackoverflow.com/questions/62072285
复制相似问题