Как вы можете утверждать, что все std::vector<std:: string> имеют заданный размер в одной строке?

У меня есть метод, который принимает std::vector хэшей sha1 в виде строк, длина которых должна составлять ровно 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 ответов

Решение

C++03, с наддувом (>= 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

Я хотел бы использовать 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();

Это ищет два последовательных элемента, которые имеют разную длину. Если все имеют одинаковую длину, он возвращает конечный итератор.

std::all_of() возвращается true если условие присутствует в каждом элементе диапазона.

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

Вам понадобится функция "для каждой", которая возвращает истину или ложь на основе переданного вектора. Затем вы, в свою очередь, можете передать эту функцию в ваш вектор строк в своем утверждении assert.

Не одна строка, но я считаю, что это близко к наиболее ясному решению в текущем C++ (вместо std::all_of с лямбда-выражением или циклом foreach в 0x):

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);
  }
}

Это также имеет небольшое преимущество, заключающееся в том, что вы можете легко найти (например, записать в журнал) строку, вызывающую сбой, чтобы решить проблему, если / когда это произойдет.

Другие вопросы по тегам