C 中標準模板庫std vector的實現

2021-08-21 18:42:06 字數 4413 閱讀 5697

以下實現了c++標準模板庫std::vector的部分實現,參考了 cplusplus.

關於c++中標準模板庫std::vector的介紹和用法可以參考

實現**vector.hpp內容如下:

#ifndef fbc_stl_vector_hpp_

#define fbc_stl_vector_hpp_

#include namespace fbcstd ; // class vector

templateinline

vector::vector() : size_(0), capacity_(0), buffer_(nullptr)

templateinline

vector::vector(size_type n, const value_type& val)

templateinline

vector::vector(const vector& x)

templateinline

vector::~vector()

templateinline

void vector::reserve(size_type n)

} buffer_ = new value_type[capacity_]; }}

templateinline

size_t vector::capacity() const

templateinline

size_t vector::size() const

templateinline

bool vector::empty() const

templateinline

t* vector::data()

templateinline

const t* vector::data() const

templateinline

t& vector::at(size_type n)

templateinline

const t& vector::at(size_type n) const

templateinline

t& vector::operator (size_type n)

templateinline

const t& vector::operator (size_type n) const

templateinline

vector& vector::operator = (const vector& x)

templateinline

void vector::clear()

templateinline

t& vector::back()

templateinline

const t& vector::back() const

templateinline

t& vector::front()

templateinline

const t& vector::front() const

templateinline

void vector::push_back(const value_type& val)

buffer_[size_] = val;

size_ += 1;

}templateinline

void vector::pop_back()

templateinline

void vector::resize(size_type n, value_type val)

for (size_t i = size_; i < n; ++i)

buffer_[i] = val;

} size_ = n;

}templateinline

t* vector::begin()

templateinline

const t* vector::begin() const

templateinline

t* vector::end()

templateinline

const t* vector::end() const

templatestatic inline

bool operator == (const vector& lhs, const vector& rhs)

return true;

}templatestatic inline

bool operator != (const vector& lhs, const vector& rhs)

templatestatic inline

bool operator < (const vector& lhs, const vector& rhs)

else

}} } else if (lhs.size() < rhs.size()) else

}} } else else

}} }

return flag;

}templatestatic inline

bool operator <= (const vector& lhs, const vector& rhs)

templatestatic inline

bool operator > (const vector& lhs, const vector& rhs)

templatestatic inline

bool operator >= (const vector& lhs, const vector& rhs)

} // namespace fbcstd

#endif // fbc_stl_vector_hpp_

測試**test_vector.cpp內容如下:

#include #include "vector.hpp"

#include "string.hpp"

#define std fbcstd

int main()

std::vectorvec4(vec3);

fprintf(stdout, "\nvec4 size: %d, capacity: %d, empty: %d\n", vec4.size(), vec4.capacity(), vec4.empty());

std::string* p2 = vec4.data();

fprintf(stdout, "vec4 data: \n");

for (size_t i = 0; i < vec4.size(); ++i)

*p2++ = "test vector";

const std::string* p3 = vec4.data();

for (size_t i = 0; i < vec4.size(); ++i)

fprintf(stdout, "\n");

} return 0;

}

cmakelists.txt內容如下:

project(samples_stl_implementation)

cmake_minimum_required(version 3.0)

set(cmake_c_flags "$ -g -wall -o2 -std=c11")

set(cmake_cxx_flags "$ -g -wall -o2 -std=c++11")

include_directories($/src)

message(status "project source dir: $")

file(glob tests $/test/*.cpp)

foreach (test $)

string(regex match "[^/]+$" test_file $)

string(replace ".cpp" "" test_basename $)

add_executable($ $)

target_link_libraries($ pthread)

endforeach()

build.sh指令碼內容如下:

#! /bin/bash

real_path=$(realpath $0)

dir_name=`dirname "$"`

echo "real_path: $, dir_name: $"

new_dir_name=$/build

mkdir -p $

cd $

cmake ..

make

cd -

編譯及執行操作步驟:將終端定位到samples_stl_implementation目錄下,執行:$ ./build.sh , 然後再執行$ ./build/test_vector即可。

github

在c 中標準模板庫STL的介紹及使用

stl主要包括容器 迭代器和演算法3大部分。stl中其他的內容如演算法等,都是圍繞容器和迭代器來實現。常用的容器類包括string類 vector容器 list容器和map容器等.string類用於字串的處理,包括常用的字串操作,如賦值 複製 貼上 刪除字元以及替換字元等 使用string類中的成員...

C 中標準庫std string的實現

以下實現了c 標準模板庫中std string中的部分實現,參考了cplusplus.關於c 中標準模板庫std string的介紹和用法可以參考 實現 string.hpp如下 ifndef fbc stl string hpp define fbc stl string hpp include ...

C 標準模板庫

map是stl的乙個關聯容器,它提供一對一 其中第乙個可以稱為關鍵字,每個關鍵字只能在map中出現一次,第二個可能稱為該關鍵字的值 的資料處理能力。資料的插入 includemapstudent strdent.insert pair 1,xiaoming strdent.insert pair 2...