количество элементов в наборе (не общее количество) - PullRequest
0 голосов
/ 21 февраля 2012

У меня есть набор строк в C ++.

Я вставляю в этот набор как:

m.insert("1-2-35-2");
m.insert("1-2-36-1");
m.insert("1-2-37-2");
m.insert("1-2-38-1");
m.insert("1-2-39-2");
m.insert("2-2-40-1");
m.insert("2-2-41-2");
m.insert("2-2-42-1");
m.insert("1-2-43-2");
m.insert("1-2-44-1");
m.insert("1-2-45-2");
m.insert("1-2-46-1");
m.insert("1-2-47-2");

я хочу вычислить количество всех строк внутри набора, которые начинаются с "2 -" (count = 3) , а также которые начинаются с " 1 -" (count = 10 ) .

есть ли способ сделать это. Я пытался с lower_bound и upper_bound, но это дает мне некоторые ошибки.

ошибки приходят для утверждения:

int i=it_upper-it_lower;

Я использую ОС Solaris SPARC.

Я только что проверил эту программу

#include <iostream>
#include <iterator>
#include <list>
using namespace std;

int main () {
  list<int> mylist;
  for (int i=0; i<10; i++) mylist.push_back (i*10);

  list<int>::iterator first = mylist.begin();
  list<int>::iterator last = mylist.end();

  cout << "The distance is: " << distance(first,last) << endl;

  return 0;
}

выдает ошибку компиляции:

line 13: Error: Could not find a match for std::distance<std::ForwardIterator, std::Distance>(std::list<int, std::allocator<int>>::iterator, std::list<int, std::allocator<int>>::iterator).
1 Error(s) detected.

Ответы [ 2 ]

2 голосов
/ 21 февраля 2012

Извините.Неправильный ответ
Обновление: count_if - алгоритм подсчета элементов на основе функции.Попробуйте, как в этом примере:

bool struct key_part: public std::unary_function< std::string, bool >
{
    std::string _part;
    key_part(const std::string part):_part(part){}
    bool operator()(std::string &s)
    {
      return s.find(_part)!=std::string::npos;
    }
}
std::count_if( m.begin(), m.end(), key_part("1-") );

Он будет считать все элементы, которые содержат «1-», как часть ключа

0 голосов
/ 21 февраля 2012

Если у вас есть современный компилятор, который поддерживает лямбда-выражения, вы можете использовать их в качестве предиката count_if:

auto if_s_1 = [](const std::string &s) { return s.find("1-") == 0; }
auto if_s_2 = [](const std::string &s) { return s.find("2-") == 0; }

int count1 = std::count_if(m.begin(), m.end(), if_s_1);
int count2 = std::count_if(m.begin(), m.end(), if_s_2);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...