Как вы можете утверждать, что все 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();
Обратите внимание, что !=
является перегруженным оператором, который увеличивает поставки, чтобы сделать построение более сложных связей, которые упрощают использование базовых реляционных и логических операторов.
Я хотел бы использовать 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);
}
}
Это также имеет небольшое преимущество, заключающееся в том, что вы можете легко найти (например, записать в журнал) строку, вызывающую сбой, чтобы решить проблему, если / когда это произойдет.