如何构建 std::vector<std::string> 然后对它们进行排序?

问题描述 投票:0回答:7

我有一堆字符串需要排序。我认为 std::vector 将是最简单的方法。但是,我以前从未使用过矢量,因此需要一些帮助。

我只需要按字母数字对它们进行排序,没什么特别的。事实上, string::compare 函数可以工作。

之后,我如何迭代它们以验证它们是否已排序?

这是我到目前为止所拥有的:

std::sort(data.begin(), data.end(), std::string::compare);

for(std::vector<std::string>::iterator i = data.begin(); i != data.end(); ++i)
{
    printf("%s\n", i.c_str);
}
c++ string sorting vector
7个回答
79
投票

你可以这样做

std::sort(data.begin(), data.end());

它会对你的字符串进行排序。然后检查它们是否正常

if(names.empty())
    return true; // empty vector sorted correctly
for(std::vector<std::string>::iterator i=names.begin(), j=i+1; 
        j != names.end(); 
        ++i, ++j)
    if(*i > *j)
        return false;
return true; // sort verified

特别是,

std::string::compare
不能用作比较器,因为它不做
sort
想要它做的事情:如果第一个参数小于第二个参数则返回 true,否则返回 false。如果您像上面一样使用
sort
,它只会使用
operator<
,这将完全做到这一点(即
std::string
使其返回
first.compare(second) < 0
)。


5
投票

问题到底是什么?似乎一切都已经在那里了。

但是,您可能应该使用

std::cout << *i << std::endl;

  1. i
    是一个迭代器==指向容器中数据的指针,所以需要
    *
  2. c_str()
    std::string
    的函数,而不是变量

您代码中的问题与您的问题无关?

给你一些提示:

  • std::vector
    还覆盖
    []
    运算符,因此您可以省去迭代器的麻烦,并将其像数组一样使用(从
    0
    迭代到
    vector.size()
    )。
  • 您可以使用
    std::set
    来代替,它在插入时自动排序(二叉树),因此您可以节省额外的排序。
  • 使用函子可以让你的输出变得更加有趣:
    copy(V.begin(), V.end(), ostream_iterator<std::string>(cout, "\n"));

2
投票

litb一如既往地正确。

我只是想指出更普遍的一点 - 任何可以与 进行比较的东西< can be sorted with std::sort. I'll sometimes sneak an operator< member function into a struct, just so I can do this.


2
投票

用于排序使用:

std::sort
std::vector< std::string>::sort(..)
方法。
检查是否已排序:
使用
std::is_sorted
检查是否已排序 - http://www.sgi.com/tech/stl/is_sorted.html

std::adjacent_find( v.begin(), v.end(), std::greater< std::string >() ) == v.end()

对于您的情况,您可以使用默认比较器

编辑:

std::is_sorted
不是标准的stl函数,它在sgi stl实现中定义。
感谢@Brian Neal 的留言。


1
投票

对字符串进行排序:

using namespace std; // to avoid using std everywhere 
std::sort(data.begin(), data.end()); // this will sort the strings

检查向量是否已排序:

if(vec.empty())
    return true; // empty vector is sorted correctly
for(std::vector< std::string>::iterator i=vec.begin(), j=i+1; j != vec.end(); ++i, ++j)
    if(*i > *j)  return false;
return true; // sort verified

C++11 检查排序向量的方法:

std::is_sorted(vec.begin(),vec.end())

现在打印排序后的向量:

   for(std::vector< std::string>::iterator i = vec.begin(); i != vec.end(); ++i)
{
    std::cout<< *i <<std::endl;
}

1
投票

您可以使用

std::set
,它自然是一个排序的容器。


0
投票

尝试使用比较器:

// Comparing function only sorts if string size is equal and keeps the larger integgers at last.
bool myFunction (string i, string j) 
{ 
   int n = i.length();
   int m = j.length();

   if (n == m)
       return i < j;
   return n < m;   
}


int main()
{
    int n;
    cin >> n;
    vector <string> arr(n);

    for (int i = 0; i < n; i++)
        cin >> arr[i];

    sort(arr.begin(), arr.end(), mFfunction);

    for (int i = 0; i < n; i++)
        cout << arr[i] << endl;

    return 0;
 }
© www.soinside.com 2019 - 2024. All rights reserved.