你如何断言所有std :: vector <std :: string>都是一行中的给定大小?</std :: string>

时间:2011-02-07 22:43:38

标签: c++ stl assert

我有一个方法接受sha1哈希的std :: vector作为字符串,其长度必须为20个字符。在单行中断言这个前提条件得到尊重会很棒。

void MyClass::setSha1Sums(const std::vector<std::string>& sha1Sums)
{
  assert(magic_oneliner_which_verifies_that_all_strings_are_20_chars_long);
  sha1Sums_ = sha1Sums;
}

5 个答案:

答案 0 :(得分:5)

C ++ 03,带有提升(&gt; = 1.33):

std::find_if( sha1Sums.begin(), sha1Sums.end()
            , boost::bind( &std::string::size, _1 ) != 20U
                ) == sha1Sums.end();

请注意,!=是一个重载运算符,可以提升资源,使构建更复杂的绑定更简单。

http://www.boost.org/doc/libs/1_45_0/libs/bind/bind.html#operators

答案 1 :(得分:3)

我会使用std::adjacent_find

bool same_lengths = 
    std::adjacent_find(v.begin(), v.end(), [](std::string a, std::string b) 
    {
        return a.length() != b.length(); 
    }) == v.end();

这将查找两个具有不同长度的连续元素。如果所有长度都相同,则返回结束迭代器。

答案 2 :(得分:2)

如果条件存在于范围的每个元素中,则

std::all_of()返回true

bool result = std::all_of(sha1Sums.begin(), sha1Sums.end(), [](std::string &s)
{
    return s.length() == 20;
});

答案 3 :(得分:1)

您将需要一个“for each”函数,该函数根据传递的向量返回true或false。然后,您可以将该函数传递给assert语句中的字符串向量。

答案 4 :(得分:1)

不是一个单行,但我发现这接近当前C ++中最明确的解决方案(而不是带有lambda的std :: all_of或0x中的foreach循环):

void MyClass::setSha1Sums(std::vector<std::string> const &sha1Sums) {
  sha1Sums_.clear();
  BOOST_FOREACH(string const &x, sha1Sums) {
    assert(x.size() == 20);
    sha1Sums_.push_back(x);
  }
}

这也有一个小优势,你可以轻松找到(例如记录)有问题的字符串,以便在出现问题时解决问题。