【问题标题】:How to find a value to remove from a vector, and remove the same position from a secondary vector?如何找到要从向量中删除的值,并从辅助向量中删除相同的位置?
【发布时间】:2016-02-13 09:54:56
【问题描述】:

我有 2 个向量,例如

 vector<int> set1;     // 4, 5, 2
 vector<string> set2;  // a, b, c

我想从set1 中查找并删除5,并且由于它是第二项,因此也要从set2 中删除b

【问题讨论】:

  • 可能还记得这个位置吗?

标签: c++ vector


【解决方案1】:

首先,一个名为set1set2向量 很奇怪。为什么不使用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,而不是左值?
  • @iksemyonov:我仍在为基于范围的for 循环与auto 寻找一个非常合理的C++11 指南,但到目前为止我发现&amp;&amp; 版本最引人注目因为它总是会做“正确的事情”,无论您是否正在处理const 元素。我觉得整个 C++ 社区在这里还没有得出一个令人满意的结论。请参阅 stackoverflow.com/questions/26991393/… 作为起点,了解有关此主题的普遍困惑。
  • 感谢您的链接!使用流迭代器进行输出是否会隐藏此问题?
  • @iksemyonov:是的。但是std::copy(begin(set2), end(set2), std::ostream_iterator&lt;decltype(set2)::value_type&gt;(std::cout, "\n")); 在我的书中并不是完全可读的代码。
  • 嗯。那么必须是一个偏好问题。不久前我得到了完全相反的印象,阅读 SO,上面是如何完成 STL“风格”的输出。
【解决方案2】:

我建议你像这样使用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);

就是这样,希望对你有帮助。

阅读来源:

http://www.cplusplus.com/reference/utility/pair/

http://www.cplusplus.com/reference/vector/vector/erase/

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-27
    • 1970-01-01
    • 2012-03-28
    相关资源
    最近更新 更多