📖
C++
  • 1. C++ Basics
    • 1.1 Input, Output, and Program Structure
      • 1.1.1 Welcome to Data Structures in C++
      • 1.1.2 Hello World
      • 1.1.3 Input and Output
      • 1.1.4 getline and cin
      • 1.1.5 Program Structure
    • 1.2 Basic Data Types
      • 1.2.1 Basic Data Types
        • 1.2.1.1 Differences between C++ and Java Data Types and Variables
      • 1.2.2 Strings and Characters
      • 1.2.3 Numbers
      • 1.2.4 Booleans
    • 1.3 Conditional Statements
      • 1.3.1 Conditional Statements
      • 1.3.2 Basic If/Else Statements
      • 1.3.3 Comparing Strings
      • 1.3.4 Logical Operators
    • 1.4 Loops
      • 1.4.1 Loops
      • 1.4.2 For Loops
      • 1.4.3 While Loops
      • 1.4.4 Searching a String
    • 1.5 Functions in C++
      • 1.5.1 Functions in C++
      • 1.5.2 Defining and Calling Functions
      • 1.5.3 Passing by Reference vs Value
      • 1.5.4 Function Prototypes
  • 2. Going Beyond the Basics
    • 2.1 Vector Basics
      • 2.1.1 Vector Basics
      • 2.1.2 Creating and Accessing Vectors
      • 2.1.3 Inserting into a Vector
      • 2.1.4 Looping Through a Vector
    • 2.2 Function Default Values
      • 2.2.1 Function Default Values
      • 2.2.2 Default Values
      • 2.2.3 Default Values with a Prototype
      • 2.2.4 Example: Splitting a String
    • 2.3 Structs
      • 2.3.1 Structs
      • 2.3.2 Defining and Accessing Structs
      • 2.3.3 Using Structs: Line Length
    • 2.4 File Input/Output
      • 2.4.1 File Input/Output
      • 2.4.2 Reading in a File
      • 2.4.3 Processing a File
      • 2.4.4 Writing to a File
      • 2.4.5 Creating an Input Stream from a String
    • 2.5 Error Handling
      • 2.5.1 Error Handling
      • 2.5.2 Validating a Number
      • 2.5.3 Validating a Vector Index
      • 2.5.4 Throwing Other Values
  • 3. Libraries
    • 3.1 Header Files
      • 3.1.1 Header Files
      • 3.1.2 Header File
      • 3.1.3 Header and Implementation File
      • 3.1.4 Safer Header
    • 3.2 Using Libraries
      • 3.2.1 Using a Utilities Library
      • 3.2.2 The Util Library
  • 4. 2D Vectors, Stacks, and Queues
    • 4.1 2D Vectors
      • 4.1.1 2D Vectors
      • 4.1.2 The 2D Vector
      • 4.1.3 Creating a 2D Vector
    • 4.3 Stacks
      • 4.3.1 Stacks
      • 4.3.2 Basic Stack
      • 4.3.3 Stack Example: Reverse a String
    • 4.5 Queues
      • 4.5.1 Queues
      • 4.5.2 Basic Queues
      • 4.5.3 Queue Example: Next in Line
  • 5. Sets and Maps
    • 5.1 Pairs and Iterators
      • 5.1.1 Pairs and Iterators
      • 5.1.2 Pairs
      • 5.1.3 Iterators
    • 5.3 Sets
      • 5.3.1 Sets
      • 5.3.2 Basic Sets
      • 5.3.3 Iterating Through a Set
      • 5.3.4 Sets of Struct Values
    • 5.4 Maps
      • 5.4.1 Maps
      • 5.4.2 Map Basics
      • 5.4.3 Iterating Through a Map
      • 5.4.4 Updating Maps
  • 6. Recursion
    • 6.1 Functional Recursion
      • 6.1.1 Functional Recursion
      • 6.1.2 Basic Recursive Problem: Exponential
      • 6.1.3 Recursion Example: Reverse String
      • 6.1.4 Recursion Example: Make Sum
    • 6.2 Procedural Recursion
      • 6.2.1 Procedural Recursion
      • 6.2.2 Print Binary
      • 6.2.3 Print Permutations
      • 6.2.4 Depth vs Breadth Search
  • 7. Pointers, Linked Lists, and Graphs
    • 7.1 Pointers
      • 7.1.1 Pointers
      • 7.1.2 Assigning and Updating Pointers
      • 7.1.3 Pointers and Functions
      • 7.1.4 Pointers and Data Structures
    • 7.2 Linked Lists
      • 7.2.1 Linked Lists
      • 7.2.2 Basic Linked List
      • 7.2.3 Linked List and Recursion
      • 7.2.4 Example: Sorted Phone Book
      • 7.2.5 Doubly Linked List
    • 7.3 Graphs
      • 7.3.1 Graphs
      • 7.3.2 Basic Example: Breadth First Search
      • 7.3.3 Application: Connecting Cities
Powered by GitBook
On this page
  • Creating a Set
  • Inserting Into a Set
  • Searching a Set
  • Other Useful Set Functions
  • Try This Example
  1. 5. Sets and Maps
  2. 5.3 Sets

5.3.2 Basic Sets

C++ sets are great data structures either on their own or combined with other data structures. As mentioned earlier, sets have two key features that distinguish them from vectors: they have no duplicates, and searches for elements in the set are done in a binary search fashion (as opposed to a vector’s linear search).

Creating a Set

Sets are a part of the C++ standard library but do need an include statement when using them.

#incluce <set>

Creating a set is very similar to other data structures. Then can either be declared empty or with initial values.

set<int> numbers { 1, 2, 3, 4};

set<string> fruit;

Inserting Into a Set

Inserting into a set is relatively straightforward, but interpreting the insert return command is a little more complicated. To insert into a set, you use the insert(value) command, for example:

fruit.insert("apple");

Since a set cannot contain duplicates, it is possible that a value already existed in the set. If it does exist, the insert will not add the new value. To find out if a value already existed and whether the new value was added, you need to look at the return value for the insert command.

The insert command return value is a pair, with the first value of the pair pointing to either the location of the new element or the location of the existing element if it already was in the set. It uses an iterator to point to that location.

The second element of the pair is a boolean value representing whether the new value was added. If it was added, this value will be true.

The basic form of the insert statement with a return value being stored as a variable would look like this:

pair<iterator, bool> varName = setName.insert(value);

Using the example above, you would have something like this:

pair<set<string>::iterator, bool> rtrn = fruit.insert("apple");

You can then interpret the return value for use. For example, if you wanted to determine if the new value was not already in the set, you could use a conditional statement:

if (rtrn.second) {
    cout << "Value added! << endl;
}

Alternatively you can skip creating the return variable and just interpret the return value directly:

if (fruit.insert("apple").second) {
    cout << "Value added! << endl;
}

Searching a Set

As mentioned above, one of the great advantages of a set is that it can be searched quickly. Behind the scenes, sets are stored in a binary tree-like format, which allows for a search to traverse the tree and find an element quickly.

To find an element in a set, you will use the find command. The find command returns an iterator that points to the element. If the element is not found, the find command will point to the end position of the set.

Here is an example of a search:

if (number.find(3) != numbers.end()) {
    cout << "The number is found." << endl;
}

Other Useful Set Functions

As you saw with other data structures such as stacks and queues, sets have a limited number of functions. In addition to the find and insert functions, there are a few others that you may come across.

Here are the most commonly used set functions:

Function
Return Type
Description

insert(value)

pair

Inserts element into set. Returns position of element and bool to indicate whether the element was inserted.

find(value)

iterator

Searches for an element and returns the position of the element. Returns the end position if not found.

empty()

bool

Returns true if the set is empty, false otherwise.

size()

int

Returns the size of the set.

erase(iterator)

void

When passed an iterator position, erase will remove that element from a set.

clear()

void

Removes all elements from the set.

begin()

iterator

Returns the beginning position of the set.

end()

iterator

Returns the end position of a set.

Previous5.3.1 SetsNext5.3.3 Iterating Through a Set

Last updated 3 years ago

Try This Example