【发布时间】:2017-02-26 00:04:46
【问题描述】:
我正在尝试遍历一个向量 (k),并检查它是否包含一个值 (key),如果包含,我想添加在不同向量 (val) 的相同索引处找到的值,然后将在那里找到的任何值添加到第三个向量 (temp)。
for(int i = 0; i < k.size(); ++i)
{
if(k.at(i) == key)
{
temp.push_back(val.at(i));
}
}
我最近学到了很多东西,但我在 C++ 方面仍然不是超级先进,这段代码确实可以满足我的目的,但速度非常慢。它可以处理 10 或 100 等大小的小向量,但对于 1000、10000 甚至 1000000 等更大的大小来说,需要的时间太长了。
我的问题是,有没有更快更有效的方法来做到这一点?
我试过了:
std::vector<int>::iterator it = k.begin();
while ((iter = std::find(it, k.end(), key)) != k.end())
{
int index = std::distance(k.begin(), it);
temp.push_back(val.at(index));
}
我认为使用向量迭代器可能会加快速度,但由于我不确定如何修复的 bad_alloc 错误,我无法让代码工作。
有谁知道我可以做些什么来让这段代码大大更快?
【问题讨论】:
-
您需要将数据保存在两个单独的向量中吗?对于地图或无序地图来说,这似乎是一项完美的工作。
-
@krzaq 不,我想我不知道,k 和 val 向量在它们的索引处彼此相等,而且它们的大小也相同。有没有办法可以把它们放在一起?那会加快速度吗?
-
您花时间查找和复制数据。地图对查找时间有很大帮助。
-
std::unordered_multimap<K,V>或std::unordered_map<K, std::vector<V>>似乎都适合此任务,其中K是可散列键类型,V分别是值类型。我包括后者是因为您似乎都想要它们,而不是通过在相等范围内的复制来创建值向量,直接映射到向量可能更高效,特别是如果您可以只使用对包含在地图并避免完全复制。