Как вы можете утверждать, что все std :: vectorзаданный размер в одной строке? - PullRequest
3 голосов
/ 08 февраля 2011

У меня есть метод, который принимает 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 ]

5 голосов
/ 08 февраля 2011

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#operators

3 голосов
/ 08 февраля 2011

Я бы использовал 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 голосов
/ 08 февраля 2011

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

bool result = std::all_of(sha1Sums.begin(), sha1Sums.end(), [](std::string &s)
{
    return s.length() == 20;
});
1 голос
/ 08 февраля 2011

Не одна строка, но я считаю, что это близко к наиболее понятному решению в текущем 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);
  }
}

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

1 голос
/ 08 февраля 2011

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

...