【问题标题】:Modify the vector class in STL c++, is this possible? [duplicate]修改STL c++中的vector类,可以吗? [复制]
【发布时间】:2015-06-22 16:42:48
【问题描述】:

我想修改vector类的一个成员函数。这可能吗?例如,我希望能够删除值,而不是向量的整数。

【问题讨论】:

  • 你为什么要这样做?
  • 嗨@Matias欢迎堆栈溢出这个问题之前被问过。只需使用谷歌或网站的搜索栏搜索。
  • 哪一个,做什么,为什么?
  • 更好的方法是查看算法库。见cplusplus.com/reference/algorithm。那里可能已经有适合您的功能了。
  • <algorithm> 标头中使用remove/remove_if 有什么问题?

标签: c++ vector stl self-modifying


【解决方案1】:

我认为这可以满足您的需求。此示例使用std::remove 从向量中删除所有出现的数字 6。 xs.erase 是为了确保向量移除元素并将向量缩小到新的大小。

我通常会避免修改 STL 容器,因为在这类事情上实现它们的人可能比我聪明得多。我建议你学习标准库算法,一般有一种适合大多数通用容器操作。

#include <iostream>
#include <algorithm>

int main(int argc, char** argv)
{
    std::vector<int> xs{1, 3, 6, 2, 6, 5};

    std::cout << "xs size: " << xs.size() << std::endl; // xs.size() == 6   

    auto value_to_remove = 6;

    xs.erase(std::remove(xs.begin(), xs.end(), value_to_remove), xs.end());

    for (const auto& x : xs)
        std::cout << x << ", ";
    std::cout << std::endl; // 1, 3, 2, 5, 

    std::cout << "xs size: " << xs.size() << std::endl; // xs.size() == 4 

    return 0;
}

在这种情况下,与大多数其他 STL 算法一样,value_to_remove 可以替换为(一元)lambda 谓词,从而开启了一个充满异国情调的价值发现世界。

您可以将上述内容包装在一个函数中,如下所示:

template <typename T>
void erase_by_value(std::vector<T>& xs, const T& value_to_remove)
{
    xs.erase(std::remove(xs.begin(), xs.end(), value_to_remove), xs.end());

}

【讨论】:

    猜你喜欢
    • 2018-04-19
    • 1970-01-01
    • 1970-01-01
    • 2020-05-06
    • 2020-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多