如何编写用于多图的插入和擦除功能的API?

时间:2018-09-19 07:29:43

标签: c++ linux boost

我正在实现一个替换容器库,该库以某种排序的方式存储任何类型的值,我需要用C ++编写API以通过使用等效的boost功能(多图)来获得Sorted功能。

我正在一个名为RogueWave库替换的项目中工作,我需要使用Boost库实现RWTValSortedVector功能的功能。我需要使用Boost库代码编写此类的API。

这两个要在Boost中实现它的东西。

  1. insert(const_reference a)

  2. remove(const_reference a)

RWTValSortedVector的参考链接为https://docs.roguewave.com/sourcepro/11/html/toolsref/rwtvalsortedvector.html

我需要这个等效的boost API来实现该功能。

在这里我提到了我的代码段格式,

boost::container::multiset<data type, less<data_type> > vec;
vec.insert(data_type("value"));
vec.insert(data_type("value"));

//for erase method
vec.erase(data_type("value"));

我需要编写容器库API,该API以某种排序方式存储任何类型的值。任何人都可以帮助我解决这个问题。

1 个答案:

答案 0 :(得分:0)

查找实际的documentation for remove

  

删除self中的第一个元素t,以使表达式(t == a)为true,并返回true。如果没有这样的元素,则返回false。

所以,这将是一个开始:

Live On Coliru

#include <boost/container/flat_set.hpp>
#include <string>

template <typename T>
struct SortedVec {
    boost::container::flat_multiset<T> _data;

    auto begin() const { return _data.begin(); }
    auto end()   const { return _data.end(); }

    bool insert(T value) {
        _data.emplace(std::move(value));
        return true;
    }

    auto erase(T const& key) {
        auto r = _data.equal_range(key);
        if (r.first == r.second)
            return false;

        _data.erase(r.first);
        return true;
    }
};

#include <iostream>
#include <iomanip>

int main() {
    SortedVec<std::string> vec;

    vec.insert("zz");
    vec.insert("value");
    vec.insert("value");
    vec.insert("aa");

    std::cout << "Before erase:";
    for (auto& s : vec) std::cout << " " << std::quoted(s);

    assert(vec.erase("value"));
    std::cout << "\nAfter 1 erase:";
    for (auto& s : vec) std::cout << " " << std::quoted(s);

    assert(vec.erase("value"));
    std::cout << "\nAfter 2 erases:";
    for (auto& s : vec) std::cout << " " << std::quoted(s);

    assert(!vec.erase("value"));
}

打印

Before erase: "aa" "value" "value" "zz"
After 1 erase: "aa" "value" "zz"
After 2 erases: "aa" "zz"