【问题标题】:How to Avoid Copying whole Values of a vector to the other container如何避免将向量的整个值复制到另一个容器
【发布时间】:2020-09-16 05:11:01
【问题描述】:

如何避免将向量kws 的整个值复制到下面的req_kws(向量的向量)中,同时在我的代码中保留两个容器kwsreq_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);
}

在第4行,即

unordered_map<string, string>& kwsBidsMap = ads_kwsBids.back();

由于引用&amp;,它会产生分段错误。但是,引用也是防止kwsBidMap 被复制到ads_kwsBids 的引用。有没有办法在kwsBidMap 上使用引用&amp; 而不会出现分段错误?

【问题讨论】:

  • 据我在您的代码中看到,req_kws 为空,在空向量上调用“back”方法将产生未定义的行为。
  • 你是对的,分段错误是由于调用req_kws为空引起的。但是,有没有办法避免运行时失败?请注意我的约束,我需要保持第 4 行(kws)和第 5 行(req_kws)不变,并希望使用第 3 行参考(&)或类似的东西来节省相同值的执行时间被存储到kws 和 req_kws。

标签: c++ vector reference copy


【解决方案1】:

在显示的代码中,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()); 以避免在添加到向量时重新分配。

【讨论】:

  • 感谢您的回答。通过编辑上述内容,我提出了一个类似但稍微复杂的问题。你能看一下吗?
【解决方案2】:

这是我解决问题的版本。

vector> ads_kwsBids;
for (const auto& kwBid : kwsBids) {
    …
    //用默认值初始化容器。
    ads_kwsBids.push_back(unordered_map());
    //& 用于防止被整个容器复制
    unordered_map& kwsBidsMap = ads_kwsBids.back();
    for (无符号 j = 0; j 
    

【讨论】:

    猜你喜欢
    • 2021-01-23
    • 1970-01-01
    • 2013-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-08
    • 2015-04-22
    相关资源
    最近更新 更多