【发布时间】:2016-02-13 09:54:56
【问题描述】:
我有 2 个向量,例如
vector<int> set1; // 4, 5, 2
vector<string> set2; // a, b, c
我想从set1 中查找并删除5,并且由于它是第二项,因此也要从set2 中删除b。
【问题讨论】:
-
可能还记得这个位置吗?
我有 2 个向量,例如
vector<int> set1; // 4, 5, 2
vector<string> set2; // a, b, c
我想从set1 中查找并删除5,并且由于它是第二项,因此也要从set2 中删除b。
【问题讨论】:
首先,一个名为set1 或set2 的向量 很奇怪。为什么不使用std::set?
无论如何,假设set2 不小于set1,一个非常通用的解决方案是使用std::distance 来计算查找结果与set1 开始之间的距离。然后,您可以将距离添加到set2 的开头:
#include <vector>
#include <algorithm>
#include <iostream>
#include <string>
int main()
{
std::vector<int> set1 = { 4, 5, 2 };
std::vector<std::string> set2 = { "a", "b", "c" };
using std::begin;
using std::end;
// get iterator to first '5' element:
auto const set1_iter = std::find(begin(set1), end(set1), 5);
// how many steps does it take to go from start to the '5' element?
auto const distance = std::distance(begin(set1), set1_iter);
// go to same position in set2:
auto const set2_iter = begin(set2) + distance;
// use position to erase the element:
set2.erase(set2_iter);
for (auto&& element : set2)
{
std::cout << element << "\n";
}
}
在实际代码中,当set2 较小或5 不存在时,您将需要添加一些错误处理。
【讨论】:
const 正确性!为什么在输出循环中使用右值 ref,而不是左值?
for 循环与auto 寻找一个非常合理的C++11 指南,但到目前为止我发现&& 版本最引人注目因为它总是会做“正确的事情”,无论您是否正在处理const 元素。我觉得整个 C++ 社区在这里还没有得出一个令人满意的结论。请参阅 stackoverflow.com/questions/26991393/… 作为起点,了解有关此主题的普遍困惑。
std::copy(begin(set2), end(set2), std::ostream_iterator<decltype(set2)::value_type>(std::cout, "\n")); 在我的书中并不是完全可读的代码。
我建议你像这样使用pair
vector < pair < int,string > > set;
推送示例
set.push_back(make_pair(1,"a"));
set.push_back(make_pair(2,"b"));
set.push_back(make_pair(3,"c"));
最后是你的问题,是如何从向量中删除所说的 2 和“b”。首先,您必须通过搜索找到索引。
for(int x = 0; x < set.size(); x++)
if(set[x].first == 2){ //here we want delete data who have int of 2
idx = x; //save the index at variable idx
break;
}
好的,找到索引后,现在使用vector::erase擦除它。这里怎么做。
set.erase(set.begin()+idx);
就是这样,希望对你有帮助。
阅读来源:
【讨论】: