Возможно, я думаю слишком просто, но этот вопрос решит ваш вопрос:
Я пытаюсь использовать displayVectorVer2 (), чтобы он отображал только первые 10 элементов
, не зная вашего полного упражнения, вот мой ответ:
...
const unsigned displayLimit = 10;
if (vobj.size()>displayLimit)
{
for (ptr=vobj.begin(); ptr<vobj.begin()+displayLimit; ++ptr)
{
std::cout << " " << *ptr;
}
std::cout << " ..." << std::endl;
}
else
...
edit:
Это сработало, но почему это работает? Я не забываю добавлять в vobj.begin () и получать дополнительные пустые элементы, добавленные к исходному вектору.
Не уверен, что именно вы сделали, но, возможно, это поможет вам понять ваш код:
...
const unsigned displayLimit = 10;
if (vobj.size()>displayLimit)
{
//Init ptr outside the for loop
ptr = vobj.begin();
//What the for loop is seeing with a more familiar syntax:
//for( ; i < 0 +displayLimit; ++i)
//what you are seeing
for (/*ptr init*/; ptr < vobj.begin() +displayLimit; ++ptr)
{
std::cout << " " << *ptr;
}
std::cout << " ..." << std::endl;
}
...
Итераторы просто дают вам значение int, и вы можете использовать его с тем, что когда-либо «съедает» значения int. В вашем случае для l oop.
Если вы скажете программе использовать итератор, вы скажете программе: «Просто дайте мне номер, с которого начинается Вектор, и добавьте 10».
В вашем случае 0 "... и добавьте 10"
Вы также можете написать такой код с n, переданным в функцию, чтобы иметь возможность использовать .end - input + 10 для с 10 строками:
...
template <class T>
void displayVectorVer2(std::vector<T>& vobj, typename std::vector<T>::iterator ptr,int n)
{
std::cout << "Vector object contains " << vobj.size() << " values which are" << std::endl;
const unsigned displayLimit = 10;
if (vobj.size()>displayLimit)
{
ptr=vobj.begin();
for (; ptr<vobj.end() -n +displayLimit; ++ptr)
{
std::cout << " " << *ptr;
}
std::cout << " ..." << std::endl;
}
else
{
for (ptr=vobj.begin(); ptr<vobj.end(); ++ptr)
{
std::cout << " " << *ptr;
}
std::cout << std::endl;
}
}
int main()
{
std::vector<int> vobj;
std::cout << "Before calling fillVector(...): vobj contains "
<< vobj.size() << " values." << std::endl;
std::cout << "\nEnter # of random values you'd like to store in vobj: ";
int n;
std::cin >> n;
std::cout << "\n*** Calling fillVector(...) ***" << std::endl;
fillVector(vobj, n);
std::cout << "\n*** Calling displayVectorVer2(...) ***" << std::endl;
std::vector<int>::iterator ptr;
displayVectorVer2(vobj,ptr,n);
}
...
Вы также не должны больше использовать srand
в современном коде, поскольку он более 10 лет с тех пор, как c ++ 11 представил <random>
и srand может нанести вред вашей программе, если используется для генерации начальных значений для чувствительного кода. Также srand предоставляет не «случайность», которую он должен предоставлять, srand генерирует некоторые числа чаще, чем другие - это не случайно.