|
Apologies for the shouting but this is important.
When answering a question please:
- Read the question carefully
- Understand that English isn't everyone's first language so be lenient of bad spelling and grammar
- If a question is poorly phrased then either ask for clarification, ignore it, or mark it down. Insults are not welcome
- If the question is inappropriate then click the 'vote to remove message' button
Insults, slap-downs and sarcasm aren't welcome. Let's work to help developers, not make them feel stupid.
cheers,
Chris Maunder
The Code Project Co-founder
Microsoft C++ MVP
|
|
|
|
|
For those new to message boards please try to follow a few simple rules when posting your question.- Choose the correct forum for your message. Posting a VB.NET question in the C++ forum will end in tears.
- Be specific! Don't ask "can someone send me the code to create an application that does 'X'. Pinpoint exactly what it is you need help with.
- Keep the subject line brief, but descriptive. eg "File Serialization problem"
- Keep the question as brief as possible. If you have to include code, include the smallest snippet of code you can.
- Be careful when including code that you haven't made a typo. Typing mistakes can become the focal point instead of the actual question you asked.
- Do not remove or empty a message if others have replied. Keep the thread intact and available for others to search and read. If your problem was answered then edit your message and add "[Solved]" to the subject line of the original post, and cast an approval vote to the one or several answers that really helped you.
- If you are posting source code with your question, place it inside <pre></pre> tags. We advise you also check the "Encode "<" (and other HTML) characters when pasting" checkbox before pasting anything inside the PRE block, and make sure "Use HTML in this post" check box is checked.
- Be courteous and DON'T SHOUT. Everyone here helps because they enjoy helping others, not because it's their job.
- Please do not post links to your question into an unrelated forum such as the lounge. It will be deleted. Likewise, do not post the same question in more than one forum.
- Do not be abusive, offensive, inappropriate or harass anyone on the boards. Doing so will get you kicked off and banned. Play nice.
- If you have a school or university assignment, assume that your teacher or lecturer is also reading these forums.
- No advertising or soliciting.
- We reserve the right to move your posts to a more appropriate forum or to delete anything deemed inappropriate or illegal.
cheers,
Chris Maunder
The Code Project Co-founder
Microsoft C++ MVP
|
|
|
|
|
how do I get started with AI
|
|
|
|
|
|
Hi
I need a little guidance trying to insert a element my element is a structure here below are my data structures
so I define a structure of type tcbholder struct tcbholder tcbx;
I initialize the iterator member with the following code
tcbx.straverse = tcbx.strptr.begin(); tcbx.stdecsx.blktraverse = tcbx.stdecsx.ablkptr.begin();
then to insert a blkdesc type I use the following code
tcbx.stdecsx.ablkptr.insert(tcbx.stdecsx.blktraverse,tcbx.stdecsx.ablkdescx);
I then think I would have to bump up the postion of the iterator so I do the following
tcbx.stdecsx.blktraverse++;
after which I get an exception that I went past the end
Any help would be appreciated
thanks
My first question is am I correct that in initalizing the iterator the code is call list::begin
and then to bump up the interator to get next postion its operator ++
struct blkdesc
{
char type;
int blkaddr;
int blklen;
};
struct stdecs
{
struct vsmdesc stordesc;
char* tcb;
struct blkdesc ablkdescx;
struct blkdesc fblkdescx;
list<blkdesc> ablkptr;
list<blkdesc>::iterator blktraverse;
list<blkdesc> fblkptr;
};
struct tcbholder
{
char* tcb;
char programname[8];
struct stdecs stdecsx;
list <stdecs> strptr;
list <stdecs>::iterator stfirstptr;
list <stdecs>::iterator straverse;
};
|
|
|
|
|
You are correct that begin() will initialize an iterator, and that the ++ operator will advance it. I'm not sure why you are storing iterators though - if you want fast random access you might be better off with a std::vector .
But if all you want to do is add items to the list, push_front() and push_back() (or emplace_front() and emplace_back() ) are easier to use. insert() is more useful for adding items in the middle of the list.
|
|
|
|
|
with insert when I add items and then use the ++ operator on the iterator I get an exception ? that I went past the end
what I am trying to do is add item 1 and have on the top of the list add item 2 and have it the second on the list.
not sure push_back do that with push_back if for arguments sake there are lets say room for 10 items and I add 3 so the first would be number 10 and when adding the second
it would be number 9 and when adding the 3rd it would number 8. If later on I would like to retrieve the first I would have to know that the first is number 8 How would I reference that with an iterator ?
thanks
|
|
|
|
|
If you want the first element of a list you can use list.front() and for the last element list.back() . The push_front() function adds elements at the start of the list and push_back() adds them at the end.
The list doesn't start off with any fixed length, it grows and shrinks as you add and remove elements.
So if I was adding two items to a list I would do something like this:
ItemType item1, item2;
std::list<ItemType> my_list;
my_list.push_back(item1);
my_list.push_back(item2);
You should use insert() when you want to add an item in the middle of the list - the iterator you pass in should point to the element you want to insert the new item in front of.
|
|
|
|
|
Okay then how I would traverse the list. If I do pop_front its gets the first element but the doc says it DELETES it as well I want to maintain the list I have it associated with a items in a dropdown combo box.
When using insert you are providing the iterator my question is how do get value after I do list::begin to get the first when I bump it up with ++ operator I get an exception that I want past the end.
|
|
|
|
|
When you want to traverse the list get an iterator with begin() . This is the first element in the list.
Access the information you need, then increment the iterator. If it is equal to end() then you have reached (one item past) the end of the list:
for(auto i = my_list.begin(); i != my_list.end(); ++i)
{
std::cout << "Item " << i->name << "\n";
}
Or you could use range-based for:
for(auto& i : my_list)
{
std::cout << "Item " << i.name << "\n";
}
|
|
|
|
|
so I can use the iterator as a pointer to reference members of my type which is a structure
Cool
|
|
|
|
|
It appears from my test that using a saved iterator will yield inconsistent results. I have a list with a single element. After adding an item before the saved iterator it still points to the first element; i.e. not the newly inserted value. If I then increment the iterator it points to an invalid address. This is reasonable as the begin and end iterators are dynamically adjusted as the list increases or decreases. So the moment you add or remove an item, your saved iterator can no longer be relied upon. The take home message is - don't do it this way, use the proper member functions of the std::list .
|
|
|
|
|
Richard not sure how you add items with insert I get the initial pointer from begin but incrementing it with the ++ operator doesn't yield valid results
I think the push_back will have things in the right order
I am not sure what value the iterator should have when using insert to add an item with push_back I think the method allocates the storage
|
|
|
|
|
I think you missed the point. The begin and end iterators are dynamic and are recalculated every time you insert or remove an element from the list. In your case you capture the begin iterator which points to the first element of the list. You then insert an item at the front of the list, so your saved iterator is no longer valid. You then increment it so it could, quite reasonably, point beyond the end of the list. To use iterators properly you must call the begin and end methods of the list each time you need their values.
|
|
|
|
|
Richard
Just one question then when calling insert you provide as the first parameter an iterator how to do you get a value for that
Do allocate the storage with for instance new
Not sure
|
|
|
|
|
The iterator is controlled by the template class. So to get the current value of an iterator you must call begin or end . As I said previously these values are not fixed, but must be recalculated each time the list changes.
You can easily test this with a simple list of integer. Do some inserts and deletes and display the saved iterators after each action.
|
|
|
|
|
In order to do an insert I have to get a value for a iterator as the documentation says you provide that to insert
In all my google searches I have never seen how that’s done I understand begin starts a iterator with a initial value how do I get a value for it when inserting the second or third item the using the ++ operator gives me an exception
|
|
|
|
|
As I keep saying: To get an iterator you must call one of the functions listed under the title Iterators at std::list - cppreference.com[^]. If you then insert an element in front of the iterator then it is no longer valid. So before you increment it call begin a second time to ensure you have the current value.
|
|
|
|
|
So to put into code what you just said
List <node> mynode;
List <node>::iterator it:
It = mynode.begin();
mynode.insert(it,valueref);
It = mynode.begin();
It++;
mynode.insert(it,valueref);
It = mynode.begin();
It+=2;
mynode.insert(it,valueref);
It = mynode.begin();
It+=3;
mynode(it,valueref);
I’ll try this out
Thanks
|
|
|
|
|
There are easier ways of adding more than one element the way you want. Take a closer look at the insert page and maybe use one of:
iterator insert( const_iterator pos, InputIt first, InputIt last );
iterator insert( const_iterator pos, std::initializer_list<T> ilist );
(5) (since C++11)
If you create a list of your values first using push_back , then you can add them in one go at whatever point you need in your main list. Or you could use push_front passing your elements in reverse order.
|
|
|
|
|
My insert is in the middle of for(;;) loop but I understand what you are saying
thanks
|
|
|
|
|
Message Closed
modified 15-May-23 19:06pm.
|
|
|
|
|
You asked Member 14968771 wrote: Can somebody smarter than me explain it and help me solve it. You don't need someone smarter - you just need to read the error message and think about what it is telling you.
I am not a C++ programmer, but it looks like you are trying to see if the contents of variable 'source' matches a pattern in a Regular Expression. However, this has no meaning because the system cannot possibly guess what pattern you want it to match against as you have not told it what pattern you want. My guess is that QRegExp is a class for regular expressions; so you will have to instantiate it, telling it (either in the constructor call or in a method of the instantiated object) what the Regular Expression that you wish to use is.
The error message that you have got is the compiler telling you that you are trying to run a member function (i.e. a method of a class) without having created an object and the function needs an object to use (which presumably has been told what Regular Expression pattern you are wanting to use for the comparison).
|
|
|
|
|
Hi -
I have a template array class based on a std::vector. All worked well w/ c++17, but there is one line I can't seem to port to the new standard. I'm trying to acquire an iterator to the underlying vector.
Any advice is greatly appreciated.
An abbreviated depiction:
template <class Type> class CMy_Array
{
private:
std::vector<Type> m_vItems;
public:
CMy_Array()
{
}
virtual ~CMy_Array ()
{
m_vItems.clear();
}
void InsertAt(int index)
{
std::vector<Type>::iterator p = m_vItems.begin();
std::vector<Type>::iterator p = static_cast <std::vector<Type>::iterator> m_vItems.begin();
}
}
|
|
|
|
|
typename std::vector<Type>::iterator p = m_vItems.begin();
or
auto p = m_vItems.begin();
|
|
|
|