C++:检查 vector<Class> 是否是 vector<Class> 的子集

标签 c++ vector subset

我有以下一段代码。我有两个字符串 (k1, k2),我使用空白定界符 (t1, t2) 将它们分成标记。然后我想检查 t1 是否包含在 t2 中。 问题是即使使用 isSubset(t1, t1) 我也得到 0 返回值。 我想避免使用 vector<string>而不是 vector<StringRef> , 如果可能的话。 我究竟做错了什么?输出应该是两个 1,但我得到的却是两个 0。

#include<string>
#include<iostream>
#include <time.h>
#include <string.h>
#include <vector>
#include <algorithm>

using namespace std;

class StringRef
{
    private:
        char const*     begin_;
        int             size_;

    public:
        int size() const { return size_; }
        char const* begin() const { return begin_; }
        char const* end() const { return begin_ + size_; }

        std::string toString() {
             std::string value(begin_);
             return value;
        }

        StringRef( char const* const begin, int const size )
            : begin_( begin )
            , size_( size )
        {}

        bool operator<(const StringRef& s) const
        {
            return (strcmp(begin(), s.begin()) < 0);
        }
};


/************************************************
 * Checks if vector B is subset of vector A    *
 ************************************************/
bool isSubset(std::vector<StringRef> A, std::vector<StringRef> B)
{
    std::sort(A.begin(), A.end());
    std::sort(B.begin(), B.end());
    return std::includes(A.begin(), A.end(), B.begin(), B.end());
}


/************************************************
 * Split string using delimeter; returns vector *
 ************************************************/
vector<StringRef> split3( string const& str, char delimiter = ' ' )
{
    vector<StringRef>   result;

    enum State { inSpace, inToken };

    State state = inSpace;
    char const*     pTokenBegin = 0;    // Init to satisfy compiler.
    for( auto it = str.begin(); it != str.end(); ++it )
    {
        State const newState = (*it == delimiter? inSpace : inToken);
        if( newState != state )
        {
            switch( newState )
            {
            case inSpace:
                result.push_back( StringRef( pTokenBegin, &*it - pTokenBegin ) );
                break;
            case inToken:
                pTokenBegin = &*it;
            }
        }
        state = newState;
    }
    if( state == inToken )
    {
        result.push_back( StringRef( pTokenBegin, &str.back() - pTokenBegin ) );
    }
    return result;
}

int main()
{

    string k1 = "9 10";
    string k2 = "9 10 2 3";
    vector<StringRef> t1 = split3(k1,' ');
    vector<StringRef> t2 = split3(k2,' ');

    cout<<isSubset(t1,t1)<<endl;
    cout<<isSubset(t2,t1)<<endl;
    return 0;
}

编辑:------ 更正 ------

已更改 toString到:

std::string toString() const {
    std::string value(begin_, size_);
    return value;
}

已更改 operator<至:(感谢@Mike Seymour)

bool operator<(const StringRef& s) const
{
    return (std::lexicographical_compare(begin(), end(), s.begin(), s.end()));
}

最后,在 split3 ,将 return 语句之前的 if block 更改为:

if( state == inToken )
{
    result.push_back( StringRef( pTokenBegin, &str.back() + 1 - pTokenBegin ) );
}

最佳答案

此代码中存在问题。

result.push_back( StringRef( pTokenBegin, &str.back() - pTokenBegin ) );

包含一个差一错误,因此最后一个标记的大小总是太短。

return (strcmp(begin(), s.begin()) < 0);

std::string value(begin_);

依赖 \0 终止的 C 字符串,但您没有使用 \0 终止的 C 字符串。

std::string toString() {

应该是一个常量方法。

在我解决了所有这些问题之后,代码就可以工作了。

关于C++:检查 vector<Class> 是否是 vector<Class> 的子集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27504239/

相关文章:

c++ - AND运算的最大值

c++ - 如何在运行时编译 C++ 代码(如 Python 中的 eval)?

c++ - 无法访问私有(private)成员:std::copy

R - 从 data.frames 列表中提取信息

r - 如何使用 ddply 对特定列的数据进行子集化?

c++ - HeapAlloc 的计算复杂度

c++ - 基于位置的动力学示例 (Matthias Müller)

c - 从不兼容的指针类型传递参数 1

c++ - 在类中初始化 vector

r - 从列表列表中选择子列表