从字符串向量获取每个字符串的第一个和最后一个字符

时间:2014-11-24 17:46:49

标签: c++ string vector

我创建了一个存储人名的vector<string> names;。我想取每个名称并创建两个变量first_letterlast_letter,其中包含每个名称的第一个和最后一个字符。但是,由于我刚开始使用c ++,我不太清楚如何完成这项工作。任何人都可以向我解释如何做到这一点,并可能提供一个例子吗?

8 个答案:

答案 0 :(得分:4)

假设name是您的string并且您使用C ++ 11即可,name.front()name.back()将起作用,否则取消引用迭代器:{ {3}}和*name.begin()。虽然您要检查name是否为空:

if (!name.empty()) {
    // Safe to proceed now
}

您可以像*name.rbegin()一样迭代names - 自C ++ 11以来

for (auto& name : names) {
    // Do things with individual name
}

或(对于较旧的C ++)

for (vector<string>::iterator it = names.begin(); it != names.end(); it++) {
    // Do things with individual name (*it)
}

建议尽可能使用常量迭代器,如果您不打算修改字符串,请将auto替换为const auto,将::iterator替换为{{1} }}

答案 1 :(得分:4)

在C ++ 11中,它变得更容易:

for (std::string& name : names) {
     char first_letter = name.front();
     char last_letter = name.back();
     // do stuff
}

在此之前,您必须使用operator[]直接访问它们:

for (size_t i = 0; i < names.size(); ++i) {
     std::string& name = names[i];

     char first_letter = name[0];
     char last_letter = name[name.size() - 1];
     // do stuff
}

答案 2 :(得分:2)

使用字符串函数front()back()

在使用这些功能之前,请确保该字符串不为空:

假设i是向量的索引:

if ( !names[i].empty() )
{
    char fChar = names[i].front();
    char bChar = names[i].back();
}

答案 3 :(得分:1)

创建一个函数以从单个字符串中获取两个字母:

std::pair<char, char>
first_and_last(const std::string& s)
{
  if (s.length() == 0)
    throw std::runtime_error("Empty string!")
  return {s.front(), s.back()};
}

(对于C ++ 03 return std::make_pair(s[0], s[s.length()-1])或其他答案显示的其他方法。)

然后依次将该函数应用于每个名称,将结果保存在新的向量中:

std::vector<std::pair<char, char>> letters;
letters.reserve(names.size());
std::transform(names.begin(), names.end(), std::back_inserter(letters), first_and_last);

或者使用基于C ++ 11范围的for循环:

std::vector<std::pair<char, char>> letters;
letters.reserve(names.size());
for (const auto& name : names)
  letters.push_back( first_and_last(name) );

答案 4 :(得分:0)

这样的东西?没有错误检查,但它是一个开始。

vector<string> names = ...;
for (vector<string>::iterator i = names.begin(); i != names.end(); ++i)
{
    string first_letter = i->substr(0, 1);
    string last_letter = i->substr(i->size() - 1, 1);
}

答案 5 :(得分:0)

首先,当然,你从一个循环开始迭代矢量。 然后你得到带有substr的那些字符,它看起来像这样

vector <string>::iterator it;
for(it = names.begin(); it != names.end(); it++)
{
    string first = (*it).substr(0, 1);
    string second = (*it).substr((*it).length()-1, 1);
    ..
    do whatever you want to
    ..
}

答案 6 :(得分:0)

考虑以下方法

#include <iostream>
#include <algorithm>
#include <vector>
#include <string>
#include <utility>
#include <iterator>

int main() 
{
    std::vector<std::string> v { "Hello", "NinjaZ", "How", "do", "you", "do" };

    for ( const auto &s : v ) std::cout << s << ' ';
    std::cout << std::endl;

    std::vector<std::pair<char, char>> v2;
    v2.reserve( v.size() );

    std::transform( v.begin(), v.end(), 
                    std::back_inserter( v2 ),
                    []( const std::string &s )
                    {
                        return std::make_pair( s.front(), s.back() );
                    } );

    for ( const auto &p : v2 )
    {
        std::cout << p.first << ' ' << p.second << std::endl;
    }

    return 0;
}

输出

Hello NinjaZ How do you do 
H o
N Z
H w
d o
y u
d o

您可以使用基于for循环的普通范围代替算法std::transform。例如

for ( const auto &s : v ) v2.push_back( { s.front(), s.back() } );

答案 7 :(得分:0)

有很多方法可以给这只猫上皮。

这是使用C ++ 11的另一个简短的可读示例。这给表带来的是std::vector::emplace_back的使用,它允许就地构造元素,而不是移动或复制构造。还有更短的语法,这很好。

假设您有一个存储字母对的容器。

std::vector<std::pair<char, char>> letters;

然后使用:

for (auto&& name : names)
    letters.emplace_back(name.front(), name.back());

如果你想抛出空名字符串,只需在std::vector::emplace_back语句之前添加一条语句:

if (name.empty()) throw std::runtime_error("Empty string!");